A Little Lisp

Preview:

DESCRIPTION

Presentation on Lisp given by James Ladd to the Melbourne Patterns group in September 2008

Citation preview

(A Little LISP)

By James Ladd http://www.jamesladdcode.com

with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

WHAT ?

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

The greatest single

programming language ever

designed.

— Alan Kay

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

John McCarthy

Created LISP

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

John McCarthy

Recursive Functions

of Symbolic

Expressions and Their

Computation by Machine

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

John McCarthy

In 1958

Created LISP

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

LISP <( )=

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

In 1958

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

1958

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

In 1958

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

In 1958

C IBM 704 FORTRAN

C AREA OF A TRIANGLE WITH A STANDARD SQUARE ROOT FUNCTION C INPUT - CARD READER UNIT 5, INTEGER INPUTC OUTPUT - LINE PRINTER UNIT 6, REAL OUTPUTC INPUT ERROR DISPLAY ERROR OUTPUT CODE 1 IN JOB CONTROL LISTING READ INPUT TAPE 5, 501, IA, IB, IC 501 FORMAT (3I5)C IA, IB, AND IC MAY NOT BE NEGATIVEC FURTHERMORE, THE SUM OF TWO SIDES OF A TRIANGLEC IS GREATER THAN THE THIRD SIDE, SO WE CHECK FOR THAT, TOO IF (IA) 777, 777, 701 701 IF (IB) 777, 777, 702 702 IF (IC) 777, 777, 703 703 IF (IA+IB-IC) 777,777,704 704 IF (IA+IC-IB) 777,777,705 705 IF (IB+IC-IA) 777,777,799 777 STOP 1C USING HERON'S FORMULA WE CALCULATE THEC AREA OF THE TRIANGLE 799 S = FLOATF (IA + IB + IC) / 2.0 AREA = SQRT( S * (S - FLOATF(IA)) * (S - FLOATF(IB)) * + (S - FLOATF(IC))) WRITE OUTPUT TAPE 6, 601, IA, IB, IC, AREA 601 FORMAT (4H A= ,I5,5H B= ,I5,5H C= ,I5,8H AREA= ,F10.2, + 13H SQUARE UNITS) STOP END

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

Created LISP as

mathematical notation for

computer programs

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

Based on Lambda Calculus

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

Lambda Calculus

the function f(x, y) = x - y

would be written as λ x. λ y.

x - y.

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

List Processing Language

(FOO (BAR 1) 2)

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

LISP pioneered:

Tree Data Structures

Automatic Storage

Management

Dynamic Typing

Object Oriented Programming

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

LISP pioneered:

Self-hosting Compiler !!

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

LISP = Pure Functional

Language

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

FIFTY YEARS AGO

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

Functional Programs Are:

Stateless

Deal only with Functions

No side effects in 'state'

Functions can return

Functions

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

(print "Hello

world")

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

(defun factorial (n)

(if (<= n 1)

1

(* n (factorial (- n

1)))))

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

(dotimes (i 10)

(format t "~A~%" (+ 1

i)))

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

LISP is a series of expressions

foo

()

(foo)

(foo bar)

(a b (c) d)

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

A LISP expression

Atom or a list of zero or more

expressions, separated by

whitespace and enclosed in ().

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

Foo = atom

() = empty list

(foo) = list of one atom

(foo bar) = list of two atoms

(a b (c) d) = list of 4 elements,

the 3rd one is itself a

list.

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

> (+ 1 2)

3

>

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

> (+ 1 (- 10 5))

6

>

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

(quote x) returns

x

>(quote a)

a

>'a

a

>(quote (+ 1 2))

(+ 1 2)

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

(atom x) returns t if

x

is an atom,

otherwise ()

>(atom 'a)

t

>(atom '(a b c))

()

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

(eq x y) returns t if x and y

are same atom or both (),

otherwise ()

>(eq 'a 'a) >(eq '() '())

t t

>(eq 'a 'b)

()

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

(car x) returns first

element of

value of x

>(car '(a b c))

a

>(car '('(foo) bar baz))

(foo)

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

(cdr x) returns everything

after the first element of

value of x

>(cdr '(a b c))

(b c)

>(cdr '('(foo) bar baz))

(bar baz)

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

(cons x y) returns a list

containing value of x

followed by value of y

>(cons 'a '(b c))

(a b c)

>(car (cons 'a '(b c)))

(b c)

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

(cond (p1 e1)...(pn en))

The p expressions are evaluated

in order until one returns t.

When one is found, the value of

the corresponding e expression

is returned as the value of the

whole cond expression.

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

(cond (p1 e1)...(pn en))

>(cond ((eq 'a 'b) 'first)

((atom 'a) 'second))

second

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

(cond (p1 e1)...(pn en))

(cond (x y) ('t z))

is equivalent to

if x then y else z

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

Recommended Reading

The Little Lisper

ANSI Common Lisp

A Little LISP, By James Ladd http://www.jamesladdcode.com with portions from The Roots Of Lisp, by Paul Graham

All images © iStockPhoto or Wikipedia

Some real code ...

Recommended