Presentation on theme: "CS 63 LISP Philip Greenspun's Tenth* Rule of Programming:"— Presentation transcript:
1CS 63 LISP Philip Greenspun's Tenth* Rule of Programming: "Any sufficiently complicated C or Fortran program contains an ad-hoc, informally-specified bug-ridden slow implementation of half of Common Lisp.“* Note: there aren’t actually nine other rules, just the tenth one.
2Something I stumbled across… “…teaching Lisp by showing you how to write several complete Lisp-based games, including a text adventure, an evolution simulation, and a robot battle.”Disclaimer: I’m not endorsing this book, I just liked the cover.
3Why 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’tBecause you can write new programs and extend old programs really, really quickly in Lisp
4Great! How can I get started? Run /usr/bin/clispFrom you can download CLISP for your own PC (Windows or Linux)Great Lisp resource page:
5Why all those parentheses? Surprisingly readable if you indent properly (use built-in Lisp editor in emacs!)Makes prefix notation manageableAn 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))))
6Lisp basics Lisp syntax: parenthesized prefix notation Lisp interpreter: read-eval-print loopNested evaluationPreventing evaluation (quote and other special forms)Forcing evaluation (eval)Allows us to evaluate code contained in a Lisp variable!
7Basic Lisp types Numbers (integers, floating-point, complex) Characters, strings (arrays of chars)#\x #\- #\B“This is a string!”Symbols, which have property lists‘a ‘x ‘jonLists (linked cells)Empty list: nil‘(a b c) ‘(2 3 jon)cons structure has car (first) and cdr (rest)
8Built-in functions For numbers A diversion: destructive functions + - * / incf decfA diversion: destructive functions(setf x 1)(setf y (+ x 1)) vs. (setf y (incf x))For listscar (first) cdr (rest) second third fourthlength nthcons append nconc listmapcar mapcanfind remove remove-if
10More Lisp types Arrays (with zero or more dimensions) Hash tables Streams (for reading and writing)StructuresFunctions, including lambda functions(defun incBy10 (n) (+ n 10))(mapcar #’(lambda (n) (+ n 10))‘( ))
11Useful 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
12A Lisp example Writing a function to compute the nth Fibonacci number Fibonacci sequence: 0, 1, 1, 2, 3, 5, 8, 13, …fib(0) = 0fib(1) = 1fib(n) = fib(n-2) + fib(n-1)
13Complete Version (defun fib (n) (cond ((eql n 0) 0) ; base case (t (+ (fib (- n 1)) ; recursively compute fib(n)(fib (- n 2))))))
14Complete 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))))))
15Now you’ve been enlightened! …well, sort of… Cartoon from xkcd.com