S tart a dribble file. In XLisp, click in File, Dribble. You will get a dialog box asking where to save the dribble file and what is to be used as the filename. Below is a sample response. Click Save.
A![](data:image/jpeg;base64,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) fter you save the dribble file, XLisp will be recording your session in a text file. When you exit XLisp, (exit), the dribble file will be closed.
Load some SETQs from the J Drive. There's a file on the J-drive that contains most of the setq's used in the XLisp-stat Lab:
(setq eins 1)
(setq xx 'x)
(setq name 'Smith)
(setq couple "John + Jane Doe")
(setq L1 '(a b c d e))
(setq L2 '(a (b c) d e ))
(setq L3 '((a b c) (d e)))
(Setq L4 '( a (b c) d (e (f g))))
(setq L5 (append L3 L2))
Load this file from the J-drive:
> (load "j:/schaefer/cs325/setqs.lsp")
; loading j:\schaefer\cs325\setqs.lsp
> T True is displayed if the file was loaded successfully.
> L5 Enter L5 and press enter. List 5 should be displayed as:
((A B C) (D E) A (B C) D E)
Assuming the load from step 2 was successful, you can start the Lisp lab.
XLisp Version 2.0 Lab Name ________________________________________________
Work Left-to-Right (across), then down.
Summary of Symbols Used in the Exercises
(Symbols are NOT case sensitive)
(setq eins 1) eins 1
(setq xx 'x) xx x
(setq y 4.6) 4.6
(setq name 'Smith) name Smith
(setq couple "John + Jane Doe") couple John + Jane Doe
(setq L1 (list 'a 'b 'c 'd 'e )) L1 ( a b c d e )
(setq L2 '( a (b c) d e )) L2 ( a (b c) d e )
(setq L3 '( (a b c) (d e))) L3 ( (a b c) (d e) )
(setq L4 '( a (b c) d ( e ( f g)))) L4 ( a ( b c) d ( e ( f g) ) )
(setq L5 (append L3 L2)) L5 ( (a b c) (d e) a (b c) d e)
Atoms
An "atom" is the basic elementary data item. Syntactically an atom is just an identifier--a string of letters and digits beginning with a letter. An atom is represented by a pointer during execution. The location pointed to contains a special atom data type designator and a pointer to a property list, which contains the various properties associated with the atom. [Pratt75, 422]
(atom t) ____ ; atom is a predicate function
|
(atom nil) ____
|
(atom 1) ____
|
(atom 4.6) ____
|
(atom eins) ____
|
(type-of eins) ______________
|
(atom xx) ____
|
(type-of xx )
|
(atom name)
|
(type-of name)
|
(atom couple) ____
|
(type-of couple) ______________
|
(/ 4 6)
|
(type-of 4/6))
|
Some Predicate Functions
(atom (list 1)) ____
|
(atom ()) ____
|
(numberp -5)
|
(numberp 'a)
|
(boundp name)
|
(boundp smith)
|
(stringp name) ____
|
(stringp couple) ____
|
(characterp xx) ____
|
(type-of 4.6) ____
|
Numeric Atoms
Numbers in integer or floating-point format may be used. The hardware representation is used, but a run-time descriptor is also required, so each number uses two words. A number is an atom with a special type designator and a pointer to the bit string representing the number... [Pratt75, 423-424]
The functions ending with "p" are predicate functions that return T (true), or NIL (false), if the operand has, or doesn't have, that property respectively. [See Betz, 27]
(numberp 1) ____
|
(numberp eins) ____
|
(numberp 'w) ____
|
(numberp nil) ____
|
(integerp 1) ____
|
(integerp 1.1) ____
|
(floatp 1) ____
|
(floatp 1.1) ____
|
(evenp 11) ____
|
(oddp 11) ____
|
(onep 0) ____
|
(onep 1) ____
|
(minusp 1) ____
|
(minusp -1) ____
|
(zerop 0) ____
|
(zerop 1) ____
|
(plusp 1) ____
|
(plusp -1) ____
|
(< 1 2) ____
|
(< 2 1) ____
|
(> 1 2) ____
|
(> 2 1) ____
|
(truncate 4.3) ____
|
(truncate 4.999) ____
|
(truncate -4.3) ____
|
(truncate -4.9) ____
|
(+ 2 3) ____
|
(+ 2 3 4 5 6 7) ____
|
(+ 2 3.1) ____
|
(+ 2 -3 4 -5 6 -7) ____
|
(- 3) ____
|
(- -3) ____
|
(- 3 4) ____
|
(- 18 4 3 9) ____
|
(1+ 3) ____
|
(1- 3) ____
|
(* 3 4) ____
|
(* 3 4 5 6) ____
|
(* 3.2 4) ____
|
(gcd 8 28) ____
|
(gcd 481 629) ____
|
(/ 10 3) ____
|
(/ 33.0 16) ____
|
(rem 10 3) ____
|
(/ 100 15.0) ____
|
(rem 15 3) ____
|
(/ 6.0 5.0 4.0) ____
|
(/ 576 4 8 3) ____
|
(float (/ 3 4)) ____
|
(/ 3 (float 4)) ____
|
(expt 2.0 3.0) ____
|
(expt (float 2) (float 3)) ____
|
(max 4 1 5 3) ____
|
(min 4 1 5 3) ____
|
(= 1 1) ____
|
(= 1 2) ____
|
(= (+ 2 3) (- 9 4)) ____
|
(/= 1 2) ____
|
(sqrt (float 2)) _________________
|
(random 997) ____
|
(abs -5) ____
|
( ^ 3 4)
|
Logical Operators
(not nil) ___
|
(not t) ____
|
(not 1) ____
|
(not (list 1)) ____
|
(and t t ) ____
|
(or t t ) ____
|
(and t nil) ____
|
(or t nil) ____
|
(and nil t ) ____
|
(or nil t ) ____
|
(and nil nil) ____
|
Interchange with XOR: (setq x -6 z 15)
(setq x (logxor x z))
(setq z (logxor x z ))
(setq x (logxor x z))
|
(and) ____
|
(or) ____
|
(not) ____
|
Lists
Lists are simple singly linked structures. Each list element contains a pointer to a data item and a pointer to the following list element. The last list element points to the special atom NIL as its successor. The two pointers in a list element are termed the CAR pointer and CDR pointer. The CAR pointer points to the data item [Contents of the Address part of Register]. The CDR pointer points to the successor of the list element [Contents of the Decrement part of Register]. Pratt75, 424.
(list 1 2) ____________
|
(list 1 2 3 4) ____________
|
(list 1 2 2 2) ____________
|
(list eins)
|
(list) ____________
|
(list nil) ____________
|
(list ()) ____________
|
(list () 1 2) ____________
|
(list 1 (list 2)) ____________
|
(list (list (list 1) 2) 3) ____________
|
(list 1 (list 2 (list 3))) ____________
|
(list eins xx name) _____________________
|
(setq L1 (list 'a 'b 'c 'd 'e ))
|
(setq L2 '(a ( b c ) d e ) )
|
(list L1 L2)
|
(list L2) ________
|
(list (list 1 2))
|
(list nil)
|
(null nil)
|
(null (list))
|
(null ())
|
(null L1)
|
(null (list 1))
|
(eq nil (list))
|
(eq L1 L2)
|
List Selectors: CAR and CDR (See notes above.)
(car nil) ________
|
(car 1) ________
|
(car (list 1 2)) ________
|
(cdr (list 1 2)) ________
|
(car L1) ________
|
(cdr L1) ________
|
(setq L3 '( (a b c) (d e))) __________
|
(setq L4 '(a (b c) d (e (f g) ) ) ) ______________
|
(car L3) ________
|
(car L4) ________
|
(car (car L3)) ________
|
(caar L3) ________
|
(car (cdr L3)) ________
|
(cadr L3) ________
|
(cadr L4) ________
|
(cddar L3) ________
|
(caadr L4) ________
|
(cdadddr L4) ________
|
List Construction: CONS, APPEND, and DOT Notation
"cons takes two pointers as operands, allocates a new list element memory word, stores the two pointers in the CAR and CDR fields of the word, and returns a pointer to the new word." [Pratt84, 507].
cons
|
Nil
|
Atom2
|
List2
|
Nil
|
1 (Nil)
|
4 (Nil . Atom2)
|
7 (Nil List-2 w/o( ) )
|
Atom1
|
2 (Atom1)
|
5 (Atom1 . Atom2)
|
8 (Atom1 List-2)
|
List1
|
3 (List1)
|
6 (List1 . Atom2)
|
9 ((List1) List-2)
|
1. (cons nil nil) ==> (nil) 4. (cons nil 2) ==> (nil . 2)
2. (cons 1 nil) ==> (1) 5. (cons 1 2) ==> (1 . 2)
3. (cons (list 1) nil) ==> ((1)) 6. (cons (list 1) 2) ==> ((1) . 2)
7. (cons nil (list 2)) ==> (nil 2)
8. (cons 1 (list 2)) ==> (1 2)
9. (cons (list 1) (list 2)) ==> ((1) 2)
(cons '( (1 2) 3 4) '(5 (6 7)) ) ==>9 ( ((1 2) 3 4) 5 (6 7))
(cons (cons 1 nil) (cons 2 nil)) ==>2 (cons (1) (2))
==>9 ((1) 2)
(cons 1 (cons 2 nil)) ==>4 (cons 1 (2)) ==>6 (1 2)
(cons (car L) (cdr L)) ==> L
(cons 1 nil) __________
|
(Observe . spacing!) '(1 . nil) __________
|
(cons 1 2) __________
|
'(1 . 2) __________
|
(cons nil 2) __________
|
'(nil . 2) __________
|
(cons nil nil) __________
|
'(nil . nil) __________
|
(atom (cons 1 2)) ______
|
(listp (cons 1 2)) ______
|
(car (cons 1 2)) __________
|
(car (list 1 2)) __________
|
(cdr (cons 1 2)) __________
|
(cdr (list 1 2)) __________
|
(cons nil (list 2)) __________
|
'(nil . (2)) __________
|
(cons 1 (list 2)) __________
|
'(1 . (2)) __________
|
(cons 1 (list 2 3)) __________
|
'(1 . (2 3)) __________
|
(cons (list 1) nil) __________
|
'((1) . nil) __________
|
(cons (list 1) 2) __________
|
'((1) . 2) __________
|
(cons 1 (cons 2 nil)) __________
|
(cons 1 (cons 2 (cons 3 nil))) __________
|
'(1 . (2 . (3 . nil))) __________
|
'(((1 . 2) . 3) . nil) __________
|
'((1 . nil) . (2 . nil)) __________
|
'((1 . nil) . ((2 . nil) . nil)) __________
|
(cons L1 L2) ____________________
|
(cons L2 L1) ____________________
|
(length (cons L1 L2)) ____
|
(length (cons L2 L1)) ____
|
(append L1 L2) ____________________
|
(list L1 L2) _____________________
|
(append L1 nil) __________
|
(append nil L1) __________
|
(append 1 L3) __________
|
(append L3 5) __________
|
(cons 1 L3) __________
|
(cons L3 5) __________
|
(append L1 L4) ____________________
|
(append L4 L1) ____________________
|
(setq L5 (append L3 L2)) _________________________________________________________
|
Property Lists Associated with Atoms
A property list is an ordinary list with elements that are logically paired in alternating property name -- property value sequence. Pratt75, 425.
(setq cat 'cat) ____________
|
(putprop cat 'katie 'name) ____________
|
(putprop cat 'grey 'color) ____________
|
(putprop cat 4 'legs) ____________
|
(putprop cat 'yes 'tail) ____________
|
(symbol-plist cat) ___________________________________________________
|
(get cat 'color) ____________
|
(remprop cat 'tail) ____
|
(symbol-plist cat) ___________________________________________________
|
User Functions
(defun first (L) (car L)) ;This is a comment.
; Define first, one parameter: L
(first L1) ________
|
(first L2) ________
|
(first (list (list (list 1 2 ) 3) 4 5)) ________
|
(load "pp")
|
(pp-def first)
|
(defun rest (L) (cdr L))
|
(rest L1) ________________
|
(rest L2) ________________
|
(defun len (L) ;Find the length of a list. ; Alternate, recursive definition
(cond (defun len (L)
( (null L) 0) (cond ( (null L) 0)
( (not (cdr L)) 1) ( T (+ 1 (len (cdr L))))
( (not (cddr L)) 2) )
( t (quote long)) )
)
)
(len ()) ____
|
(len (list 1)) ____
|
(len '(a b)) ____
|
(len L1) ____
|
(defun average (x y) ; x, y are local; sum is nonlocal
(setq sum (+ x y))
(/ sum 2)
)
sum ____
|
(average 9 37) ____
|
sum ____
|
x ____ y ____
|
(average 11 12) ____
|
(average 11.0 12) ____
|
(defun factorial (N) ; A non-recursive function
(prog (y) ; local variable y, unknown outside of factorial
( cond ; check for possible problems
( (not (numberp N)) (return NIL) ) ; N is not numeric
( (minusp N) (return NIL) ) ; N is negative
( (not (integerp N)) (return NIL) ) ; N is float
) ; remaining N's are nonnegative integers
(setq y 1) ; initialize Y
fetch ; a label for a later goto
(cond ( (zerop N) (return y))) ; return condition, N = 0
(setq y (* y N )) ; next product
(setq N (1- N)) ; reduce N by 1
(go fetch) ; repeat
) )
(factorial 0)
|
(factorial 1)
|
(factorial 4)
|
(factorial 10)
|
(factorial 'A)
|
(factorial '(1 2))
|
(factorial -7)
|
(factorial 3.7)
|
(defun fact (n) ; recursive factorial
(cond ((= n 1) 1)
( T (* n (fact (- n 1))))
)
)
Miscellaneous
(setq x '(1 2 3)) ________
|
(setq y (cdr x)) ________
|
(setq w y) ________
|
(setq z '(2 3)) ________
|
(eq w y) ________
|
(= y z) ____
|
(eq y z) ____
|
(type-of nil) ________
|
(type-of eins) ________
|
(type-of name) ________
|
(type-of couple) ________
|
(type-of L1) ________
|
(room) ;Show memory allocation statistics
|
; this is a comment
|
(dribble "a:filename.txt") ;Start recording in a file
|
(gc) ;Force garbage collection
|
(room)
|
(dribble) ;Stop recording in the file
|
(exit) ; get out of XLISP
|
|
References
[Betz] Betz, David. XLISP: An Object-oriented Lisp, Version 2.0. Peterborough, NH: David Betz, 6 Feb 1988.
[Fladung] Fladung, Bonnie J. The XLISP Primer. Englewood-Cliffs, NJ: Prentice-Hall, 1987.
[Friedman] Friedman. Little LISPer. [QA76.73/L23/F74].
[Pratt84] Pratt, Terrence W. Programming Language Design and Implementation, Second Edition. Englewood-Cliffs, NJ: Prentice-Hall, 1984. [QA76.7/P7].
[Sebesta97] Sebesta, Robert W. Concepts of Programming Languages, 3rd Ed. Reading, MA: Addison-Wesley, 1997, pp. 503-506. 6th Ed:584, much of Scheme material, 587-603.
[Wilensky] Wilensky, Robert. Common LISPcraft. New York: W. W. Norton and Company, 1986.
[Winston] Winston, Patrick H. and Horn, B. H. LISP. Reading, MA: Addison-Wesley, 1981. [QA76.73/L23/W56].
newLISP "newLISP is a general purpose scripting language for developing web applications and programs in general and in the domain of artificial intelligence (AI) and statistics."
U of Minnesota Statistics Software
XLisp-Stat Information University of Minn., Luke Tierney
XLISP Home Page David Betz started all this a long time ago and he has an object based, XLisp 3.0, but needs to be built with .Net and I still can't find out how to run it.
XLISP-PLUS Home Page Tom Almy's version of XLisp
The Eternal Flame, Lyrics The Eternal Flame recording
Share with your friends: |