27
LISP

LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Embed Size (px)

Citation preview

Page 1: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

LISP

Page 2: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Lisp

•Ispirato da funzioni ricorsive e lambda calcolo•Inventato da John McCarthy•Progenitore dei linguaggi di programmazione funzionale

Page 3: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

LISP: LISt Processor

LISP è stato disegnato originariamente per l’Intelligenza ArtificialeHa vari dialetti: Common Lisp, FranzLisp, AutoLisp, etc.E’ basato su un approccio ricorsivo ed incrementalePrevalentemente utilizzato mediante interpreti

Page 4: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

LISP: Stile interattivo

• Utente: definisce funzioni o richiede un calcolo

• Interprete: accetta la definizione o esegue il calcolo

Page 5: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Tipi di dato in Lisp

Liste

S - espressioni

Floating point

Integer

Lista non vuota

Lista vuota

Atomi

Simboli

Numeri

Page 6: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Esempi

• Lista vuota: ‘()’ anche chiamata ‘NIL’

• Atomo: ‘ALPHA’

• Lista (piatta): ‘( A B D )’

• Lista: ‘( A B ( D E ) A)’

• Intero: 3

• Floating point: 3.14

Page 7: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Liste

• Liste:– Una lista può contenere come

elementi atomi o altre liste.– Gli elementi sono racchiusi tra

parentesi.– Una lista può essere vuota.

Page 8: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Operazioni su liste

• CAR : restituisce il primo elemento di una lista– (CAR ‘(5 2 9)) 5

• CDR : restituisce la lista senza il primo elemento.– (CDR ‘(5 2 9)) (2 9)

• Possiamo mescolare CAR e CDR in ogni combinazione.

Page 9: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Esempi:(CAR (CDR L)) = (CADR L)Es. : (CAR (CDR ‘(1 2 3 4)))

2

(CDR (CAR L)) = (CDAR L)Es. : (CDR (CAR ‘((1 2) (2 3) (3 4) (4 5))))

(2)

•CAR restituisce un ELEMENTO (atomo o lista)•CDR restituisce una LISTA•(CAR NIL) = (CDR NIL) = NIL

Che cos’e’ l’apice che precede le liste di numeri?

Page 10: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

QUOTE (‘)

•Notazione prefissa: il primo elemento di una lista e’

la funzione, gli altri elementi sono gli operandi.

•Come distinguo (+ 1 1) (= somma dei numeri 1 e

1) dalla lista costituita dai simboli “+”, “1” e “1”?

•Soluzione: operatore QUOTE (abbreviato con

l’apice):

(QUOTE (1 2 3)) = ‘(1 2 3)

La lista (1 2 3) non viene “valutata” (= non si cerca

una funzione 1 da applicare a 2 e 3)

Page 11: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Altre operazioni su liste: CONS

CONS: Accetta un elemento e una lista e restituisce la lista con l’elemento inserito al primo posto

(CONS ‘A ‘(B C))(A B C)

(CONS ‘A (CDR ‘(B C)))(A C)

Page 12: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Funzioni aritmetiche(+ 3.14 2.5)5.64

(+ 2 (+ 3 6))11

(* 6 4)24

(/ 25 5)5

Page 13: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Float e Integer

(/ 27 9) Divisione tra interi con risultato intero3

(/ 14.0 4.0) Divisione tra reali3.5

(/ (FLOAT 14) (FLOAT 4)) Equivalente al precedente3.5

Page 14: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Altre funzioni matematiche

(MAX 7 6 8)8

(MIN 7 6 8)6

(ABS -8)8

(EXPT 2 3)8

(SQRT 25)5

(ROUND 1.25)1

(ROUND 1.75)2

X intero:X=(ROUND (FLOAT X))

Page 15: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Altre funzioni matematiche

(TRUNCATE 14 4) Divisione tra interi3

(REM 14 4) REMainder: resto2

X,Y interi; Y diverso da 0:(+ (* (TRUNCATE X Y) Y) (REM X Y)=X

Page 16: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Funzioni predefinite su liste: LIST

LIST prende n operandi e restituisce la lista i cui elementi sono gli n operandi

(LIST ‘A)(A)

(LIST ‘A ‘B)(A B)

(LIST ‘A (CDR ‘(A B C)))(A (B C))

Page 17: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Funzioni predefinite su liste: APPEND

APPEND prende n liste e restituisce la lista composta dagli elementi delle n liste

(APPEND ‘(1 2) ‘(3 4))(1 2 3 4)

(APPEND ‘(1 2) ‘(CDR (1 2)))(1 2 CDR (1 2))

Page 18: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Predicati True/False

In Lisp la lista vuota (NIL) è False; tutto il resto è True.

Per indicare esplicitamente il valore True si usa T.

Page 19: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Esempi di predicati

• ATOM verifica se l’operando è un atomo• LISTP verifica se l’operando è una lista• NULL verifica se l’operando è una lista vuota• EQ verifica se gli operandi (S-espressioni)

sono ugualiOltre a questi ci sono, tra gli altri, gli operatori

relazionali: =, >,< che operano su numeri

Page 20: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Numero di operandi

• N: +,*,-,\,MAX, MIN, APPEND, LIST, AND

• 2: TRUNCATE, REM, EXPT, EQ, =, >,<

• 1: ABS, SQRT, FLOAT, NOT, NULL, ATOM, LISTP

Page 21: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Definizione di funzioni: DEFUN

• Sintassi:

• (DEFUN <nome_funzione> (<operando1> <operando2>…<operandoN>) (<corpo_della_funzione>) )

Page 22: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Esempio di definizione di funzione

(DEFUN Secondo (L) (CADR L))

Esempio:

(Secondo ‘( A C D))

C

Page 23: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Espressioni condizionali: COND

Sintassi

(COND (<espressione1> <azione1>)

(<espressione2> <azione2>)

(<espressioneN> <azioneN>))

Page 24: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Esempio: funzione PARI

PARI(X)= T se X è pari

NIL altrimenti

(DEFUN PARI (X)

(COND ((= (REM X 2) 0) T)

(T NIL)))

Page 25: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Ricursione

APPARTIENE(A,L)= T se A appartiene alla lista L NIL altrimenti

(DEFUN APPARTIENE (A L)(COND ((NULL L) NIL)

((EQ A (CAR L)) T)(T (APPARTIENE A (CDR L)) )))

(APPARTIENE 'A '(A B C))T

Page 26: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Altri esempi

(DEFUN UNIONE (L1 L2)

(COND ((NULL L1) L2)

((APPARTIENE (CAR L1) L2) (UNIONE (CDR L1) L2))

(T (UNIONE (CDR L1) (CONS (CAR L1) L2)))))

(UNIONE '(A B C) '(C D E))

(B A C D E)

Page 27: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale

Cenni sull’interprete

Valutazione di S-espressioni:• Atomi: la valutazione di numeri (simboli)

restituisce il numero (simbolo) stesso.• Liste: vengono valutati tutti gli elementi di primo

livello (a meno di QUOTE)– Il primo elemento è sempre un nome di funzione; viene

valutato il corpo della funzione corrispondente.– Tutti gli altri elementi vengono valutati e i risultati

corrispondenti vengono usati come argomenti della funzione