2. Why Lisp?
• Because it’s the most widely used AI
programming language
• Because it’s good for writing production
software (Graham article)
• Because it’s got lots of features other
languages don’t
• Because you can write new programs and
extend old programs really, really quickly in
Lisp
3. Great! How can I get started?
• On sunserver (CS) and gl machines, run
/usr/local/bin/clisp
• From http://clisp.cons.org you can
download CLISP for your own PC
(Windows or Linux)
• Great Lisp resource page:
http://www.apl.jhu.edu/~hall/lisp.html
4. Why all those parentheses?
• Surprisingly readable if you indent properly (use
built-in Lisp editor in emacs!)
• Makes prefix notation manageable
• An expression is an expression is an expression,
whether it’s inside another one or not
•(+ 1 2)
•(* (+ 1 2) 3)
•(list (* 3 5) ‘atom ‘(list inside a list)
(list 3 4) ‘(((very) (very) (very) (nested
list))))
5. Lisp basics
• Lisp syntax: parenthesized prefix notation
• Lisp interpreter: read-eval-print loop
• Nested evaluation
• Preventing evaluation (quote and other
special forms)
• Forcing evaluation (eval)
–Allows us to evaluate code contained in a Lisp
variable!
6. Basic Lisp types
• Numbers (integers, floating-point, complex)
–27 -2 7.519
• Characters, strings (arrays of chars)
–#x #- #B
–“This is a string!”
• Symbols, which have property lists
–‘a ‘x ‘jon
• Lists (linked cells)
– Empty list: nil
–‘(a b c) ‘(2 3 jon)
–cons structure has car (first) and cdr (rest)
7. Built-in functions
• For numbers
–+ - * / incf decf
• A diversion: destructive functions
–(setf x 1)
–(setf y (+ x 1)) vs. (setf y (incf x))
• For lists
–car (first) cdr (rest) second third
fourth
–length nth
–cons append nconc list
–mapcar mapcan
–find remove remove-if
9. More Lisp types
• Arrays (with zero or more dimensions)
• Hash tables
• Streams (for reading and writing)
• Structures
• Functions, including lambda functions
–(defun incBy10 (n) (+ n 10))
–(mapcar #’(lambda (n) (+ n 10))
‘(1 2 3 4 5))
10. Useful help facilities
•(apropos ‘str) list of symbols whose
name contains ‘str
•(describe ‘symbol) description of
symbol
•(describe #’fn) description of function
•(trace fn) print a trace of fn as it runs
•:a abort one level out of debugger
11. A Lisp example
• Writing a function to compute the nth
Fibonacci number
–Fibonacci sequence: 0, 1, 1, 2, 3, 5, 8, 13, …
• fib(0) = 0
• fib(1) = 1
• fib(n) = fib(n-2) + fib(n-1)
12. Complete Version
(defun fib (n)
(cond ((eql n 0) 0) ; base case
((eql n 1) 1) ; base case
(t (+ (fib (- n 1)) ; recursively compute fib(n)
(fib (- n 2))))))
13. Complete Version with Error
Checking and Comments
(defun fib (n)
"Computes the nth Fibonacci number."
(cond ((or (not (integerp n)) (< n 0)) ; error case
(error "~s must be an integer >= 0.~&" n))
((eql n 0) 0) ; base case
((eql n 1) 1) ; base case
(t (+ (fib (- n 1)) ; recursively compute fib(n)
(fib (- n 2))))))
14. Complete Version with Error
Checking and Comments
(defun fib (n)
"Computes the nth Fibonacci number."
(cond ((or (not (numberp n)) (< n 0)) ;error case
(error "~s must be a number >= 0.~&" n))
((eql n 0) 0) ;base case
((eql n 1) 1) ;base case
(t (+ (fib (- n 1)) ; recursively compute fib(n)
(fib (- n 2))))))
15. Now you’ve been enlightened!
…well, sort of…
Cartoon from xkcd.com