IL LINGUAGGIO LISP Marco Broglia

52
IL LINGUAGGIO LISP Marco Broglia

Transcript of IL LINGUAGGIO LISP Marco Broglia

IL LINGUAGGIO LISP

²

±

¯

°Marco Broglia

Lisp: carta d’identita ci.1

Carta d’Identita

• Nome: Lisp (List Processor)

• Nato il: autunno 1958

• Genere: interprete

• Padre: John McCarthy

• Incubazione: IBM 704

• Segni particolari:

– notazione prefissa: (+ 1 1 2 3 5 8)

– utilizzo di (((((( parentesi ))))))

• Pseudo-acronimi:

– Lots of Irritating Superfluous Parentheses

– Lost In a Sea of Parentheses

IL LINGUAGGIO LISP

®

­

©

ªwelcome

Lisp: welcome welcome.1

(quote ’)

L’operatore quote, abbreviato spesso con ilsimbolo quote (’), accetta un solo argomento e lorestituisce senza valutarlo:

> (quote (+ 1 2))

(+ 1 2)

> ’(* 3 4)

(* 3 4)

Esercizio [w.1] Valutare

> ’’(the list (a b c) has (+ 1 2) elements)

Soluzione [w.1]

’(THE LIST (A B C) HAS (+ 1 2) ELEMENTS)

quote object ⇒ object

Lisp: welcome welcome.2

(list (cons ’l (cons ’i ’(s t))))

Le liste vengono costruite con l’operatore cons

oppure con l’operatore list:

> (cons ’a ’(b c d))

(A B C D)

> (cons ’a (cons ’b nil))

(A B)

> (cons ’(a) ’(b))

((A) B)

> (cons nil ’(a))

(NIL A)

> (list ’a ’b)

(A B)

> (list ’my (* 1 2) "Sons")

(MY 2 "Sons")

La lista vuota e rappresentata da nil:

> ()

NIL

> nil

NIL

cons object1 object2 ⇒ ( object1 . object2 )

list object* ⇒ ( object* )

Lisp: welcome welcome.3

(1 2 3)

Esercizio [w.2] Fornire tre diversecons-espressioni che restituiscono (1 2 3).

Soluzione [w.2]

1. (cons 1 ’(2 3))

2. (cons 1 (cons 2 ’(3)))

3. (cons 1 (cons 2 (cons 3 nil)))

Lisp: welcome welcome.4

append vs cons vs list

Esercizio [w.3] Valutare le seguenti espressioni:

1. (cons ’(i am) ’(a cons))

2. (list ’(i am) ’(a list))

3. (append ’(i am) ’(an append))

Soluzione [w.3]

1. ((I AM) A CONS)

2. ((I AM) (A LIST))

3. (I AM AN APPEND)

append list* ⇒ ( elements of list* )

Lisp: welcome welcome.5

(list (car ’(c d r))

(car (cdr ’(c a r))) ’r)

Le funzioni primitive per l’estrazione deglielementi di una lista sono car (Contents of theAddress part of Register number) e cdr (Contentsof the Decrement part of Register number):

> (car ’(a b c))

A

> (cdr ’(a b c))

(B C)

> (car (cdr (cdr ’(a b c d))))

C

> (caddr ’(a b c d))

C

car cons ⇒ first object in cons

cdr cons ⇒ second object in cons

cadr list ⇒ car (cdr list)

Lisp: welcome welcome.6

myfourth and myreverse

Esercizio [w.4] Sia lst la lista (a b c d e).Utilizzando solo le funzioni car e cdr, fornireun’espressione che estragga il quarto elemento.

Soluzione [w.4]

> (car (cdr (cdr (cdr lst))))

D

> (fourth lst)

D

Esercizio [w.5] Sia lst la lista (a b c).Utilizzando solo le funzioni c[ad]*r e cons,invertire la lista.

Soluzione [w.5]

> (cons (caddr lst) (cons (cadr lst)

(cons (car lst) nil)))

(C B A)

> (reverse lst)

(C B A)

Lisp: welcome welcome.7

let ((me see))

L’operatore di assegnamento piu generale e setf:

> (setf lst ’(1 2 3))

(1 2 3)

> (setf (car lst) 4)

4

> lst

(4 2 3)

L’operatore let viene utilizzato per definirevariabili locali:

> (let ((a 1) (b 2))

(+ a b))

3

> (let ((n 1))

(setf n 2)

n)

2

> n

error: n unbound

setf (object value)* ⇒ ( object ⇐ value )*

let ( ( var value )* ) body ⇒ ( var ⇐ value )* body

Lisp: welcome welcome.8

(if cond ition)

Il condizionale piu semplice e l’operatore if:

> (if (oddp (random 10)) ’odd ’even)

ODD or EVEN

> (setf e (exp 1))

2.7182818284590451

> (if (< e pi) (/ pi e))

1.1557273497909217

Il terzo argomento e opzionale (default: nil).

Il condizionale piu classico e l’operatore cond:

> (setf googol (expt 10 100))

1000000000 . . . (1 seguito da 100 zeri)

> (cond ((= (mod googol 3) 1) ’3k+1)

((= (mod googol 3) 2) ’3k-1)

(t ’3k))

3K+1

if test expr1 expr2 ⇒ if (test) expr1 else expr2

cond ( ( test expr )* ) ⇒ first expr with true test

Lisp: welcome welcome.9

(and t (not ’false))

Il simbolo t rappresenta il valore vero, nil ilvalore falso:

> (and t (+ 1 2))

3

> (not 3)

NIL

Le funzioni che valutano la verita o la falsita diun’espressione sono dette predicati :

> (listp ’(a b c))

T

> (list (numberp 1) (atom ())

(listp 27) (consp ’(a b)))

(T T NIL T)

and expr* ⇒ if (any expr = nil) nil else last expr

or expr* ⇒ if (all expr* = nil) nil else first true expr

not object ⇒ if (object = nil) t else nil

null object ⇒ if (object = nil) t else nil

listp object ⇒ if (object is a list) t else nil

Lisp: welcome welcome.10

(and (or (not (null nil))))

Esercizio [w.6] Valutare le seguenti espressioni:

1. (list 1 (+ 2 3))

2. (if (listp 1) (+ 1 2) (+ 3 4))

3. (list (and (listp 3) t) (+ 1 2))

4. (list (and 0) (null nil) (not nil)

(not (listp nil)))

5. il titolo

Soluzione [w.6]

1. (1 5)

2. 7

3. (NIL 3)

4. (0 T T NIL)

5. NIL

Lisp: welcome welcome.11

(f (u (n (z (i (o ’(n i)))))))

La definizione di nuove funzioni avviene tramite lafunzione defun:

> (defun mythird (lst)

(car (cdr (cdr lst))))

MYTHIRD

> (mythird ’(a b c d))

C

Esercizio [w.7] Definire la funzione 3> che,data una lista di 3 valori lst, verifica se essi sonoin ordine strettamente decrescente.

Soluzione [w.7]

> (defun 3> (lst)

(and (> (car lst) (cadr lst))

(> (cadr lst) (caddr lst))))

3>

> (list (3> ’(3 2 1)) (3> ’(1 2 3)) (3> ’(1 1 0)))

(T NIL NIL)

defun fname ( parameters ) body ⇒ fname

Lisp: welcome welcome.12

max2

Esercizio [w.8] Definire la funzione max2 cherestituisce il maggiore tra due argomenti.

Soluzione [w.8]

> (defun max2 (x y)

(if (> x y) x y))

MAX2

> (setf e (exp 1))

2.7182818284590451

> pi

3.1415926535897931

> (max2 (expt e pi) (expt pi e))

23.140692632779267

> (expt pi e)

22.459157718361041

Lisp: welcome welcome.13

(r (e (c (u (r ’(s i o n))))))

Molto naturale in Lisp, la ricorsione rappresentauno dei piu eleganti stili di programmazione a cuisi riferiscono i seguenti due classici.

La funzione fattoriale:

n! =

{1 n = 0

n (n− 1)! n >= 1

viene spesso implementata:

> (defun ! (n)

(if (= n 0)

1

(* n (! (- n 1)))))

!

> (! 10)

3628800

> (! 100)

933262154439441526816992388562 ...

... 916864000000000000000000000000

(158 cifre)

Lisp: welcome welcome.14

La funzione di Fibonacci:

Fn =

0 n = 0

1 n = 1

Fn−1 + Fn−2 n > 1

viene spesso implementata:

> (defun fib (n)

(if (< n 2)

n

(+ (fib (- n 1)) (fib (- n 2)))))

FIB

> (fib 10)

55

> (fib 100)

354224848179261915075

Lisp: welcome welcome.15

0123456789

Esercizio [w.9] Il piu piccolo numero diFibonacci contenente tutte le cifre da 0 a 9 e F74:

> (fib 74)

1304969544928657

Utilizzando la precedente definizione della funzionefib, quante volte essa viene invocata per calcolareF74?

Soluzione [w.9] Sia C(n) il numero diinvocazioni della funzione fib con argomento n.

n 0 1 2 3 4 5 6 7 8

Fn 0 1 1 2 3 5 8 13 21

C(n) 1 1 3 5 9 15 25 41 67

Si ha C(n) = 2Fn+1 − 1, dunque fib vieneinvocata

C(74) = 2F75 − 1 = 4 222 970 155 956 099

volte.

Lisp: welcome welcome.16

$ = super !

Esercizio [w.10] Implementare in modoricorsivo la funzione superfattoriale cosı definita:

n$ =

n∏i

i! = 1! · 2! · · ·n!

Soluzione [w.10]

> (defun $ (n)

(if (= n 1)

(! 1)

(* (! n) ($ (- n 1)))))

$

> ($ 10)

6658606584104736522240000000 (28 cifre)

> ($ 100)

270317685765174997105580900275 ...

... 000000000000000000000000000000

(6941 cifre)

Lisp: welcome welcome.17

λ expression

Una λ expression, detta anche anonymousfunction, definisce una funzione senza associarlaad un nome.

Sintatticamente e una lista formata da tre parti: ilsimbolo lambda, una lista di parametri e il corpodella funzione.

Ad esempio, l’espressione

(lambda (x) (* x x))

definisce la funzione che calcola il quadrato:

> ((lambda (x) (* x x)) 111111111)

12345678987654321

Esercizio [w.11] Definire la λ expression chedetermina il minore tra due numeri.

Soluzione [w.11]

(lambda (x y) (if (< x y) x y))

Lisp: welcome welcome.18

f(x) = g(h(x))

E possibile passare funzioni come argomenti adaltre funzioni:

> (apply #’+ ’(1 1 2 3 5))

12

> (mapcar #’oddp ’(1 1 2 3 5))

(T T NIL T T)

> (mapcar #’+ ’(1 1 2 3 5) ’(1 2 6 24 120))

(2 3 8 27 125)

oppure definire funzioni che restituiscono funzionicome valori di ritorno:

> (defun addn (n) #’(lambda (x) (+ x n)))

ADDN

> (setf add10 (addn 10))

internals

> (mapcar add10 ’(1 2 3))

(11 12 13)

apply f ( args ) ⇒ ( f args )

mapcar f ( list )* ⇒ ( ( f elem1 ) . . . ( f elemn ) )

lambda ( parameters ) body ⇒ function

IL LINGUAGGIO LISP

²

±

¯

°esercizi semplici

Lisp: exercises exer.1

lisp-equazioni

Esercizio [e.1] Risolvere le seguentilisp-equazioni in x:

1.> (car (x (cdr ’(a (b c) d))))

B

2.> (x 13 (/ 1 0))

13

3.> (x #’list ’(1 nil))

(1 NIL)

Soluzione [e.1]

1. x = car

2. x = or

3. x = apply

Lisp: exercises exer.2

la funzione che non funziona

Esercizio [e.2] Un giovane Lisper sta provandoa scrivere la funzione mysum che somma tutti glielementi non nil di una lista. Egli ne scrive duediverse versioni, ma entrambe non risultanofunzionanti. Dove sta sbagliando? Riusciamo adaiutarlo?

1.(defun mysum1 (lst)

(remove nil lst)

(apply #’+ lst))

2.(defun mysum2 (lst)

(let ((x (car lst)))

(if (null x)

(mysum2 (cdr lst))

(+ x (mysum2 (cdr lst))))))

remove object list ⇒ list without object

Lisp: exercises exer.3

la funzione che ora funziona

Soluzione [e.2]

1. la funzione remove non modifica la listaoriginaria> lst

(1 2 NIL 3)

> (remove nil lst)

(1 2 3)

> lst

(1 2 NIL 3)

> (mysum1 ’(1 2 () 3))

error: +: operand 3 and NIL

2. nella condizione di uscita, in entrambi i casiviene invocata la funzione ricorsivamente,provocando un loop infinito

Lisp: exercises exer.4

Possiamo correggere i due errori cosı:

1.> (defun mysum1 (lst)

(apply #’+ (remove nil lst)))

MYSUM1

2.> (defun mysum2 (lst)

(let ((x (car lst)))

(cond ((null lst) 0)

((null x) (mysum2 (cdr lst)))

(t (+ x (mysum2 (cdr lst)))))))

MYSUM2

IL LINGUAGGIO LISP

²

±

¯

°esercizi: (le liste)

Lisp: exercises exer.6

mylast

Esercizio [e.3] Definire la funzione mylast che,data una lista lst, restituisce l’ultimo elemento.

> (mylast ’(a b c d))

D

> (mylast ’(a b (c (d))))

(C (D))

> (mylast ’())

NIL

> (last ’(a b (c (d))))

((C (D)))

> (car (last ’(a b (c (d)))))

(C (D))

Soluzione [e.3]

> (defun mylast (lst)

(cond ((null (cdr lst)) (car lst))

(t (mylast (cdr lst)))))

MYLAST

Lisp: exercises exer.7

presente?

Esercizio [e.4] Definire il predicato presentp

che determina se un atomo a compare in una lista,a qualsiasi livello. Confrontare il predicatopresentp con la funzione predefinita member.

> (setf lst1 ’(1 2 3)

lst2 ’((1) 2 (3)))

((1) 2 (3))

> (list (member 1 ())

(member 1 lst1)

(member 1 lst2))

(NIL (1 2 3) NIL)

member object list ⇒ sublist starting with object

Lisp: exercises exer.8

presente!

Soluzione [e.4]

> (defun presentp (a lst)

(cond ((atom lst) (eql a lst))

(t (or (presentp a (car lst))

(presentp a (cdr lst))))))

PRESENTP

> (setf lst1 ’(1 2 3)

lst2 ’((1) 2 (3)))

((1) 2 (3))

> (list (member 1 ())

(member 1 lst1)

(member 1 lst2))

(NIL (1 2 3) NIL)

> (list (presentp 1 ())

(presentp 1 lst1)

(presentp 1 lst2))

(NIL T T)

Lisp: exercises exer.9

lol

Esercizio [e.5] Definire la funzione lol che,data una lista lst, determina se contiene liste.

> (lol ’(1 2 3))

NIL

> (lol ’(1 () 2 3))

T

> (lol ’(()))

T

Soluzione [e.5]

> (defun lol (lst)

(cond ((null lst) nil)

((listp (car lst)) t)

(t (lol (cdr lst)))))

LOL

Lisp: exercises exer.10

nlol

Esercizio [e.6] Definire la funzione nlol che,data una lista lst, conta le liste presenti al suointerno.

> (nlol ’(1 2 3))

0

> (nlol ’(1 () (2)))

2

> (nlol ’(()))

1

Soluzione [e.6]

> (defun nlol (lst)

(cond ((null lst) 0)

((listp (car lst))

(+ 1 (nlol (cdr lst))))

(t (nlol (cdr lst)))))

NLOL

Lisp: exercises exer.11

nlol-r

Esercizio [e.7] Definire la funzione nlol-r

che, data una lista lst, conta il numero di listepresenti al suo interno, a qualsiasi livello.

> (nlol-r ’(1 2 3))

0

> (nlol-r ’(1 () ((2))))

3

> (nlol-r ’((())))

2

Soluzione [e.7]

> (defun nlol-r (lst)

(cond ((null lst) 0)

((listp (car lst))

(+ 1 (nlol-r (car lst))

(nlol-r (cdr lst))))

(t (nlol-r (cdr lst)))))

NLOL-R

Lisp: exercises exer.12

sum-r

Esercizio [e.8] Definire la funzione sum-r che,data una lista lst, somma tutti i numeri presenti,a qualsiasi livello.

> (sum-r ’((1 (a)) 2 ’(3 b (() (4)))))

10

> (sum-r ’())

0

Soluzione [e.8]

> (defun sum-r (lst)

(cond ((atom lst) (if (numberp lst) lst 0))

(t (+ (sum-r (car lst))

(sum-r (cdr lst))))))

SUM-R

Lisp: exercises exer.13

rmn

Esercizio [e.9] Definire la funzione rmn che,data una lista lst, rimuove tutti i numeripresenti, a qualsiasi livello.

> (rmn ’(a 5 (c) (((4))) e ()))

(A (C) ((NIL)) E NIL)

> (rmn ’(1))

NIL

> (rmn ’())

NIL

> (rmn ’(()))

(NIL)

Soluzione [e.9]

> (defun rmn (lst)

(cond ((null lst) nil)

((numberp (car lst)) (rmn (cdr lst)))

((atom (car lst))

(cons (car lst) (rmn (cdr lst))))

(t (cons (rmn (car lst))

(rmn (cdr lst))))))

RMN

Lisp: exercises exer.14

rms

Esercizio [e.10] Definire la funzione rms che,data una lista lst, rimuove tutti gli atomi nonnumerici presenti, a qualsiasi livello.

> (rms ’(a 5 (c) (((4))) e ()))

(5 NIL (((4))) NIL)

> (rms ’(1))

(1)

> (rms ’())

NIL

> (rms ’(()))

(NIL)

Soluzione [e.10]

> (defun rms (lst)

(cond ((null lst) nil)

((listp (car lst)) (cons

(rms (car lst)) (rms (cdr lst))))

((numberp (car lst)) (cons

(car lst) (rms (cdr lst))))

(t (rms (cdr lst)))))

RMS

Lisp: exercises exer.15

verym

Esercizio [e.11] Definire la funzione myrev che,data una lista lst, inverte l’ordine degli elementi.

> (myrev lst)

inverte l’ordine degli elementi della lista lst

> (myrev ’(a c e t o n e))

(E N O T E C A)

> (myrev ’(a (b (c)) ()))

(NIL (B (C)) A)

> (myrev ’())

NIL

> (myrev (myrev ’(l i v e)))

(L I V E)

Soluzione [e.11]

> (defun myrev (lst)

(cond ((atom lst) nil)

(t (append (myrev (cdr lst))

(list (car lst))))))

MYREV

Lisp: exercises exer.16

very myrev

Esercizio [e.12] Definire la funzione myrev-r

che, data una lista lst, inverte l’ordine deglielementi, a qualsiasi livello.

> (myrev-r lst)

inverte l’ordine degli elementi di qualsiasi livello

della lista lst

> (myrev-r ’(a (b (c)) ()))

(NIL ((C) B) A)

> (myrev-r ’())

NIL

> (myrev-r (myrev ’(e s (t a) t o)))

(E S (A T) T O)

Soluzione [e.12]

> (defun myrev-r (lst)

(cond ((atom lst) lst)

(t (append (myrev-r (cdr lst))

(list (myrev-r (car lst)))))))

MYREV-R

Lisp: exercises exer.17

prodotto × cartesiano

Esercizio [e.13] Definire la funzione cart che,date due liste v1 e v2, ne calcola il prodottocartesiano.

> (cart ’(a b c) ’(1 2))

((A 1) (A 2) (B 1) (B 2) (C 1) (C 2))

Soluzione [e.13]

> (defun distl (x v)

(cond ((null v) nil)

(t (cons (list x (car v))

(distl x (cdr v))))))

DISTL

> (distl ’a ’(1 2 3))

((A 1) (A 2) (A 3))

> (defun cart (v1 v2)

(cond ((null v1) nil)

(t (append (distl (car v1) v2)

(cart (cdr v1) v2)))))

CART

IL LINGUAGGIO LISP

®

­

©

ªesercizi . . .misteriosi

Lisp: exercises exer.19

what?

Esercizio [e.14] Descrivere il comportamentodelle seguenti funzioni e valutare il risultato dellaloro invocazione con l’argomento

(a 5 (c) (((4))) e ())

1.(defun what1 (x)

(cond ((null x) 0)

((listp (car x))

(+ 1 (what1 (cdr x))))

(t (what1 (cdr x)))))

2.(defun what2 (x)

(cond ((null x) 0)

((numberp (car x))

(+ 1 (what2 (cdr x))))

(t (what2 (cdr x)))))

Lisp: exercises exer.20

that!

Soluzione [e.14]

1. la funzione what1 conta il numero di listepresenti nella lista x al primo livello> (what1 ’(a 5 (c) (((4))) e ()))

3

2. la funzione what2 conta i numeri presenti nellalista x al primo livello> (what2 ’(a 5 (c) (((4))) e ()))

1

Lisp: exercises exer.21

an odd mystery

Esercizio [e.15] Descrivere il comportamentodelle seguenti funzioni:

1.(defun odd (x)

(cond ((null x) nil)

((atom x) x)

(t (cons (odd (car x))

(odd (cdr x))))))

2.(defun mystery (x)

(cond ((null x) 1)

((atom x) 0)

(t (max (+ (mystery (car x)) 1)

(mystery (cdr x))))))

Soluzione [e.15]

1. la funzione odd ritorna il proprio input

2. la funzione mystery calcola la profondita di x

Lisp: exercises exer.22

mysteries

Esercizio [e.16] Descrivere il comportamentodelle seguenti funzioni:

1.(defun mystery1 (x)

(and (not (null x))

(or (null (car x))

(mistery1 (cdr x)))))

2.(defun mystery2 (x y)

(if (null y) nil

(if (eql x (car y)) 0

(let ((z (mystery2 x (cdr y))))

(and z (+ z 1))))))

Soluzione [e.16]

1. la funzione mistery1 determina se x contieneelementi nulli al primo livello

2. la funzione mystery2 ritorna la posizione di xnella lista y al primo livello

IL LINGUAGGIO LISP

®

­

©

ªesercizi . . . efficienti

Lisp: exercises exer.24

fastfib

Esercizio [e.17] La funzione di Fibonacci vienespesso implementata come segue:

(defun fib (n)

(if (< n 2)

n

(+ (fib (- n 1)) (fib (- n 2)))))

Individuare il problema principale di efficienza edefinire la funzione fastfib, piu efficiente.

Soluzione [e.17]

> (defun fib1 (fib fib+1 m)

(if (= m 0)

fib

(fib1 fib+1 (+ fib fib+1) (- m 1))))

FIB1

> (defun fastfib (n)

(fib1 0 1 n))

FASTFIB

> (fastfib 10)

55

> (fastfib 100)

354224848179261915075

Lisp: exercises exer.25

fast$?

Esercizio [e.18] La funzione superfattoriale,

n$ =

n∏i

i! = 1! · 2! · · ·n!

viene spesso implementata come segue:

> (defun $ (n)

(if (= n 1)

(! 1)

(* (! n) ($ (- n 1)))))

$

Individuare il problema principale di efficienza edefinire la funzione fast$, piu efficiente.

Lisp: exercises exer.26

fast$

Soluzione [e.18] La funzione $ invoca n voltela funzione !, con valori compresi tra 1 e n,eseguendo cosı piu volte gli stessi prodotti.

Considerando che

(n + 1)! = n! (n + 1)

(n + 1)$ = n$ (n + 1)!

si puo utilizzare lo schema seguente:

> (defun $1 (k k! $k m)

(if (= m 0)

$k

(let ((k+1! (* k! (+ k 1))))

($1 (+ k 1) k+1! (* $k k+1!)

(- m 1)))))

$1

> (defun fast$ (n)

($1 0 1 1 n))

FAST$

Lisp: exercises exer.27

la funzione di Ackermann

La funzione di Ackermann e la piu semplicefunzione (Turing) computabile (ricorsiva) nonprimitiva ricorsiva:

A(x, y) =

y + 1 x = 0

A(x− 1, 1) x > 0, y = 0

A(x− 1, A(x, y − 1)) x > 0, y > 0

x, y 0 1 2 3 4

0 1 2 3 4 5

1 2 3 4 5 6

2 3 5 7 9 11

3 5 13 29 61 125

4 13 65533 265536 − 3 2265536 − 3 ?

Lisp: exercises exer.28

ack

Esercizio [e.19] Definire la funzione ack checalcola la funzione di Ackermann.

Soluzione [e.19]

> (defun ack (x y)

(cond ((= x 0) (+ y 1))

((= y 0) (ack (- x 1) 1))

(t (ack (- x 1) (ack x (- y 1))))))

ACK

> (ack 0 10)

11

> (ack 1 10)

12

> (ack 2 10)

23

> (ack 3 10)

8189

> (ack 4 1)

stack overflow

IL LINGUAGGIO LISP

®

­

©

ªesercizi: esercizi

Lisp: exercises exer.30

Willard Van Orman Quine

Filosofo americano, analitico e logico, studio inmodo approfondito le tecniche dell’autoreferenza.

Un quine e un (meta)programma che produce inoutput il codice di cui e composto.

Esercizio [e.20] Definire una funzione quine.

Soluzione [e.20]

> ((lambda (x) (list x (list ’quote x)))

’(lambda (x) (list x (list ’quote x))))

((LAMBDA (X) (LIST X (LIST ’QUOTE X)))

’(LAMBDA (X) (LIST X (LIST ’QUOTE X))))

La λ expression ha argomento(lambda (x) (list x (list ’quote x))) erestituisce una lista formata da due elementi:

1. il primo e l’argomento x

2. il secondo e: (list ’quote x) ⇒(list (quote quote) x) ⇒ (quote x) ⇒ ’x