CIS 400 LECTURE 12
More
Lisp:
 
Predicate
functions, continued:
 
>(null
'())            ;empty list
t
>(null
nil)
t
(null
t)
nil
>(null
sam)
nil
>(member
'a '(a b c))     ; find a list that has
"a" as an element
(a
b c)
>(member
'a '((a b) c (d e))            ; member is
top level only
nil
 
;
"not equal" in XLisp is  /=
 
>(assoc
'c '((a b) (c d) (e f))            ; find
a sub-list with "c" as its "car"
(c
d)
 
;;;;;;;   here's an interesting function!!  ;;;;;;;;;;;;
 
>(and nil t t)      ;short circuit boolean, if NO nil is
found, all are evaluated and last element ;is output
nil
>(and 'sam nil 'harry)
nil
>(and 1 2 3)
3
 
>(defun sign (a b)
     (and (oddp a) (oddp b) 'both-odd)
   )
>(sign 2 3)
nil
>(sign 3 3)
t
>(or nil t t)        ;short circuit boolean, first t is
evaluated
t
>(or 'sam nil 'harry)
sam
>(or nil nil nil)
nil
>(defun sign (a b)
      (or (oddp a) (oddp b) 
'both-odd)
   )
>(sign 2 3)
t
>(sign 3 3)
t
>(sign 2 2)
both-odd          
 
>(defun compute (op x y)
     (cond ((equal op 'sum) (+ x y))
               ((equal op 'prod) (* x y))
                (t '(does not compute))            ;"t" will never evaluate as "nil", so
if previous 2 
      )                                                     ;condition
fail, the "t" results in the output "does not
   )                                                        ;compute"                                      
      
>(compute 'sum 2 3)            ; similar to (+ 2 3)
5
>(compute 'subtract 3 2)            ; all evaluations fail
(does not compute)
 
>(if (listp a) (car a)
'(not a list)
   )                                                        ;
"if" is a predicate function found in Xlisp and ;common-Lisp                                                    
 
>(cond (( listp a) (car
a))
             ' (t '(not list))
 )                                                          ;
similar function using "cond" instead of "if"
 
;;;;;;;;;;;   creating local variables  ;;;;;;;;;;;;;;;;;
 
>(defun augment (first
second)            ;"first" and
"second" are passed parameters
     (let ((item first)            ;
"let" creates local variable
             (bag second)
            )
          (if (listp first) (setq item second bag first))
          (if (member item bag) bag (cons item bag))
      )
   )
 
>(augment 2 '(1 3))
(2 1 3)                                                  ;
adds 2 as new "car"
 
>(augment 2 '(1 2 3))
(1 2 3)                                                  ;
2 is already in list
>(defun count (L)            ; this function will count number of
item in a list
® (do ((count 0 (+1 count))            ; initialize count to 0, then
increment by 1
             (loaf L (cdr loaf))
     ((null loaf) count)            ;
test to stop
¬ )                                                      ;
ARROWS REPRESENT BEGINNING AND
   )                                                        ;
END OF LOCAL VARIABLE SCOPE
 
>(count '(1 2 3))
3
 
;;;;;;;;;;;   input and output     ;;;;;;;;;;;;;
>(setq a (read))
>1                                                        ; enter input
of "1"
>a                                                        ; ask to
output the value of "a"
1
>(setq a (read))
>(defun sum (x y) (+ x
y))            ; this actually makes Lisp
"read" the function that is 
                                                            ; is
defined by the input
>(eval
a)                                               ;
what has been read is now evaluated
sum
>(sum
2 3)
5