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*
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>
<symbol>
(FUNCALL <functional-object> <arg-1> ... <arg-n>)
<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>)
(APPLY #'+ '(1 2 3 4 5 6)) => 21 (APPLY #'* 2 3 '(4 5 6)) => 120
LAMBDA
(LAMBDA <arg-list> ...<body>)
<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
---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]