Lecture #12
Programming Languages
MISHRA 95
DEFVAR
(DEFVAR *COUNT* 0)
(DEFUN COUNT-CONS (X Y)
(PROGN (SETQ *COUNT* (+ 1 *COUNT*))
(CONS X Y)))
(DEFUN COUNT APPEND (X Y)
(IF (NULL X)
Y
(COUNT-CONS (CAR X)
(COUNT-APPEND (CDR X) Y))))
PROGN: Explicitly sequences LISP
statements. Value of the last subform is returned as the value
of the PROGN-form
(SETQ *COUNT* 0) (COUNT-APPEND '(A B C) '(D)) => (A B C D) *COUNT* => 3
---Slide 2---
LOCAL VARIABLES
LET & LET*
(LET ((<var-1> <value-1>)
...
(<var-n> <value-n>)
<body> ))
<value-1>,
,
<value-n> is evaluated in turn.
<var-1>,
, <var-n> are
given their respective values.
<body>
<value-j> cannot refer to
<var-i> even if
.
---Slide 3---
LET and LET*
(DEFUN DISTANCE (P1 P2)
(LET ((XDIFF (- (CAR P1) (CAR P2)))
(YDIFF (- (CAR (CDR P1)) (CAR (CDR P2))))
(SQRT (+ (* XDIFF XDIFF) (* YDIFF YDIFF))))
))
LET*
Sequentially binds each new variable as its value is
computed
Avoids the `` right crawl'' problem
(DEFUN PAINT-COST (COLOR)
(LET ((PAIR (ASSOC COLOR
'((BLUE . 8.00) (RED . 5.50) (YELLOW . 13.25)))))
(LET ((PRICE (IF (NULL PAIR)
*DEAFULT-PAINT-PRICE*
(CDR PAIR))))
(+ PRICE (* *TAX-RATE* PRICE)))))
---Slide 4---
LET*: (contd)
COLOR = BLUE => PAIR = (BLUE . 8.00) => PRICE = 8.00 => PRICE = PRICE + *TAX-RATE* PRICE
LET*
(DEFUN PAINT-COST (COLOR)
(LET* ((PAIR (ASSOC COLOR
'((BLUE . 8.00) (RED . 5.50) (YELLOW . 13.25))))
(PRICE (IF (NULL PAIR)
*DEAFULT-PAINT-PRICE*
(CDR PAIR))))
(+ PRICE (* *TAX-RATE* PRICE))))
---Slide 5---
Lisp as Data Bases
ASSOC
((<key-1>.<val-1>) (<key-2>.<val-2>)...(<key-n>.<val-n>))
ASSOC searches the list linearly until
NIL, or
EQL) and returns the cons-cell
containing the key
(ASSOC 3 '((1 PARTRIDGE)
(2 TURTLE DOVES)
(3 FRENCH HENS)
(4 TURTLE DOVES)
(5 GOLD RINGS)))
=>
(3 FRENCH HENS)
---Slide 6---
Functional Programming Style
FUNCALL
It is possible to pass functions as values (i.e.,
data) and apply them to arbitrary sets of arguments.
(SYMBOL-FUNCTION <symbol>) or #<symbol>
Returns functional object
associated with <symbol>
(FUNCALL <functional-object> <arg-1> ... <arg-n>)
Calls the <functional-object> with
the arguments it received.
---Slide 7---
Examples
(SETQ *RELATIONSHIP-FUNCTIONS*
'((FATHER . FATHER-OF?)
(MOTHER . MOTHER-OF?)))
(DEFUN FIND-RELATIVE (RELATION PERSON)
(LET ((FUN-NAME (CDR (ASSOC RELATION
*RELATIONSHIP-FUNCTION*))))
(IF (NULL FUN-NAME)
(ERROR "Unknown relationship")
(FUNCALL (SYMBOL-FUNCTION FUN-NAME)
PERSON))))
(FIND-RELATIVE (FATHER TOM))
=>
(FUNCALL (SYMBOL-FUNCTION 'FATHER-OF?) 'TOM)
= (FUNCALL #'FATHER-OF? 'TOM)
= (FATHER-OF? 'TOM)
SYMBOL-FUNCTION
(i.e., #)
(FUNCALL '(LAMBDA (N) (+ 1 N)) 3) => 4
---Slide 8---
APPLY & LAMBDA
APPLY
(APPLY <fun-obj> <arg-1> ...<arg-n> <arg-more>)
Calls the functional object with
variable number of arguments and they may be in a
list.
(APPLY #'+ '(1 2 3 4 5 6)) => 21
(APPLY #'* 2 3 '(4 5 6)) => 120
LAMBDA
(LAMBDA <arg-list> ...<body>)
Lambda Expression
(
<arg-list>) <body>.
It is like DEFUN...except that it makes an
anonymous functional object
(APPLY
#'(LAMBDA (A B C) (* A (+ B C)))
'(4 3 5))
=> 4 * (3 + 5) = 32
---Slide 9---
Mapping Functions: MAPCAR
(MAPCAR <function> <arglist-1>...<arglist-n>)
<function> must take n arguments.
CAR's of each
<arglist-i>
CADR's, etc., until the end
of the shortest list is reached
MAPCAR
---Slide 10---
Examples
(MAPCAR #'NUMBERP '(A 3 B 2 4 C 7))
=> (NIL T NIL T T NIL T)
(MAPCAR #'(LAMBDA (N) (+ 1 N))
'(5 3 6 7 2))
=> (6 4 7 8 3)
(MAPCAR #'(LAMBDA (X Y) (CONS X Y))
'(MIAMI DENVER OAKLAND LOS-ANGELES)
'(DOLPHINS BRONCOS RAIDERS RAMS))
=> ((MIAMI.DOLPHINS) (DENVER.BRONCOS)
(OAKLAND.RAIDERS) (LOS-ANGELES.RAMS))
---Slide 11---
How LISP Works
APPLY and EVAL
APPLY and EVAL
LAMBDA
argument lists in internal LAMBDA application
LET and DO, are implemented via LAMBDA
---Slide 12---
LISP Compiler
---Slide 13---
LISP Storage Layout
User program provides additional objects into all three parts
---Slide 14---
LISP Internals
Pair of pointers
Collection of Pointers pointing to
---Slide 15---
Type of a LISP Object
---Slide 16---
OBARRAY or OBLIST
A vector of list of symbols
(Think of a Hash Table)
OBARRAY to
retrieve one of the lists of symbols.
---Slide 17---
Garbage Collection
A cons cell not accessible,
---Slide 18---
Garbage Collection (contd)
(DEFUN MARK-CELL (CONS-CELL)
(COND ((NOT (MARKEDP CONS-CELL))
(SETMARK CONS-CELL)
(IF (CONSP (CAR CONS-CELL))
(MARK-CELL (CAR CONS-CELL)))
(IF (CONSP (CDR CONS-CELL))
(MARK-CELL (CDR CONS-CELL))))))
---Slide 19---
Garbage Collection (contd)
*FREE-LIST*.
(DEFUN CHECK-CELL (CONS-CELL)
(COND ((MARKEDP CONS-CELL)
(UNSETMARK CONS-CELL))
(T (RPLACD CONS-CELL *FREE-LIST*)
(SETQ *FREE-LIST* CONS-CELL))))
---Slide 20---
Lisp Function with Garbage Collection
CONS function as follows:
(DEFUN CONS (X Y)
(IF (NULL *FREE-LIST*)
(GARBAGE-COLLECT))
(LET ((CONS-CELL *FREE-LIST*))
(SETQ *FREE-LIST* (CDR CONS-CELL))
(RPLACA CONS-CELL X)
(RPLACD CONS-CELL Y)
CONS-CELL))
[End of Lecture #12]