280 likes | 540 Views
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 Artificiale
E N D
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 Artificiale • Ha vari dialetti: Common Lisp, FranzLisp, AutoLisp, etc. • E’ basato su un approccio ricorsivo ed incrementale • Prevalentemente utilizzato mediante interpreti
LISP: Stile interattivo • Utente: definisce funzioni o richiede un calcolo • Interprete: accetta la definizione o esegue il calcolo
Tipi di dato in Lisp S - espressioni Liste Atomi Lista non vuota Lista vuota Simboli Numeri Floating point Integer
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
Liste • Liste: • Una lista può contenere come elementi atomi o altre liste. • Gli elementi sono racchiusi tra parentesi. • Una lista può essere vuota.
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.
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?
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)
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)
Funzioni aritmetiche (+ 3.14 2.5) 5.64 (+ 2 (+ 3 6)) 11 (* 6 4) 24 (/ 25 5) 5
Float e Integer (/ 27 9) Divisione tra interi con risultato intero 3 (/ 14.0 4.0) Divisione tra reali 3.5 (/ (FLOAT 14) (FLOAT 4)) Equivalente al precedente 3.5
Altre funzioni matematiche (SQRT 25) 5 (ROUND 1.25) 1 (ROUND 1.75) 2 X intero: X=(ROUND (FLOAT X)) (MAX 7 6 8) 8 (MIN 7 6 8) 6 (ABS -8) 8 (EXPT 2 3) 8
Altre funzioni matematiche (TRUNCATE 14 4) Divisione tra interi 3 (REM 14 4) REMainder: resto 2 X,Y interi; Y diverso da 0: (+ (* (TRUNCATE X Y) Y) (REM X Y)=X
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))
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))
Predicati True/False In Lisp la lista vuota (NIL) è False; tutto il resto è True. Per indicare esplicitamente il valore True si usa T.
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 uguali Oltre a questi ci sono, tra gli altri, gli operatori relazionali: =, >,< che operano su numeri
Numero di operandi • N: +,*,-,\,MAX, MIN, APPEND, LIST, AND • 2: TRUNCATE, REM, EXPT, EQ, =, >,< • 1: ABS, SQRT, FLOAT, NOT, NULL, ATOM, LISTP
Definizione di funzioni: DEFUN • Sintassi: • (DEFUN <nome_funzione> (<operando1> <operando2>…<operandoN>) (<corpo_della_funzione>) )
Esempio di definizione di funzione (DEFUN Secondo (L) (CADR L)) Esempio: (Secondo ‘( A C D)) C
Espressioni condizionali: COND Sintassi (COND (<espressione1> <azione1>) (<espressione2> <azione2>) … (<espressioneN> <azioneN>))
Esempio: funzione PARI PARI(X)= T se X è pari NIL altrimenti (DEFUN PARI (X) (COND ((= (REM X 2) 0) T) (T NIL)))
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
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)
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