Lisp EN -- Laboratory 7 -- 2006-2007 -- info.uvt.ro
Lisp EN -- 2006-2007 -- info.uvt.ro
- Lisp EN -- Laboratory 1 -- 2006-2007 -- info.uvt.ro
- Lisp EN -- Laboratory 2 -- 2006-2007 -- info.uvt.ro
- Lisp EN -- Laboratory 3 -- 2006-2007 -- info.uvt.ro
- Lisp EN -- Laboratory 4 -- 2006-2007 -- info.uvt.ro
- Lisp EN -- Laboratory 5 -- 2006-2007 -- info.uvt.ro
- Lisp EN -- Laboratory 6 -- 2006-2007 -- info.uvt.ro
- Lisp EN -- Laboratory 7 -- 2006-2007 -- info.uvt.ro
- Lisp EN -- Test -- 2006-2007 -- info.uvt.ro
Property lists
[edit | edit source]The get function is used to access (and with the use of setf to modify) the property list of a symbol. In CLisp each symbol has an associated property list.
This list can be compared with a key-value mapping that exists for each symbol. The set of property lists can also be compared with the contents of a relational database table in which the symbol is the primary key, the property is a column, and the value is the tuple's value for the given column.
(get <symbol> <property>) => <value> (setf (get <symbol> <property>) <value>)
In the following example we try to build a parent-child database.
(defmacro father (p c)
`(setf (get ,c 'father) ,p))
(defmacro mother (p c)
`(setf (get ,c 'mother) ,p))
(defmacro father? (c)
`(get ,c 'father))
(defmacro mother? (c)
`(get ,c 'mother))
(father 'a 'c)
(mother 'b 'c)
(father 'c 'e)
(mother 'd 'e)
(father 'f 'd)
(mother 'g 'd)
(father? 'c) ;=> a
(mother? 'c) ;=> b
(mother? (father? 'e)) ;=> b
Advanced usage of lambda
[edit | edit source]When we call lambda it creates a lexical closure, and holds a reference to all the symbols that were available in the context (and at the time) it was called.
(defun make* (n)
(lambda (x) (* x n)))
(setf *2 (make* 2))
(setf *3 (make* 3))
(mapcar *2 '(1 2 3 4)) ;=> (2 4 6 8)
(mapcar *3 '(1 2 3 4)) ;=> (3 6 9 12)
(mapcar (make* 5) '(1 2 3 4)) ;=> (5 10 15 20)
Ciprian Dorin Craciun
2007-04-19