CS 63 LISP Philip Greenspuns Tenth Rule of

  • Slides: 15
Download presentation
CS 63 LISP Philip Greenspun's Tenth* Rule of Programming: "Any sufficiently complicated C or

CS 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.

Something I stumbled across… “…teaching Lisp by showing you how to write several complete

Something 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.

Why Lisp? • Because it’s the most widely used AI programming language • Because

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

Great! How can I get started? • Run /usr/bin/clisp • From http: //clisp. cons.

Great! How can I get started? • Run /usr/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

Why all those parentheses? • Surprisingly readable if you indent properly (use built-in Lisp

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, 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) (nested list))))

Lisp basics • Lisp syntax: parenthesized prefix notation • Lisp interpreter: read-eval-print loop •

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!

Basic Lisp types • Numbers (integers, floating-point, complex) – 27 -2 7. 519 •

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)

Built-in functions • For numbers – + - * / incf decf • A

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) fourth – length nth – cons append nconc list – mapcar mapcan – find remove-if second third

Built-in functions (cont’d) • Printing: print, format – (print “string”) print output – (format

Built-in functions (cont’d) • Printing: print, format – (print “string”) print output – (format …) formatted output • Advanced list processing: assoc, mapcar • Predicates: listp, numberp, stringp, atom, null, equal, eql, and, or, not • Special forms: setq/setf, quote, defun, defparameter, defconstant, if, cond, case, progn, loop

More Lisp types • Arrays (with zero or more dimensions) • Hash tables •

More Lisp types • Arrays (with zero or more dimensions) • Hash tables • Streams (for reading and writing) • Structures • Functions, including lambda functions –(defun inc. By 10 (n) (+ n 10)) –(mapcar #’(lambda (n) (+ n 10)) ‘(1 2 3 4 5))

Useful help facilities • (apropos ‘str) list of symbols whose name contains ‘str •

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

A Lisp example • Writing a function to compute the nth Fibonacci number –

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)

Complete Version (defun fib (n) (cond ((eql n 0) ((eql n 1) (t (+

Complete Version (defun fib (n) (cond ((eql n 0) ((eql n 1) (t (+ (fib 0) ; base case 1) ; base case (- n 1)) ; recursively compute fib(n) (- n 2))))))

Complete Version with Error Checking and Comments (defun fib (n) "Computes the nth Fibonacci

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))))))

Now you’ve been enlightened! …well, sort of… Cartoon from xkcd. com

Now you’ve been enlightened! …well, sort of… Cartoon from xkcd. com