' interpreteaza o lista ca o structura de date. Absenta acestuia, interpreteaza lista ca un program.'(a b c)
'(1 2 3)
'(1 a 3.14)
'(+ 1 2)
'(1 (+ 3 4) 2)
(+ 1 3)
(= 4)(+ 1 (- 1 2))
(= 0)`
(quasiquote) si ,
(comma), se pot folosi in tandem pentru a crea combinatii de liste-program cu liste-structuri de date, ca in exemplul urmator:`(1 ,(+ 2 3) 4)
(define <var_name> <expr>)
unde <var_name>
si <expr>
desemneaza un nume de variabila, respectiv expresie. De remarcat este ca <expr>
este fie o variabila primitiva, fie o lista (date/program).(set! <var_name> <expr>)
unde <var_name>
si <expr>
au aceleasi semnificatie ca in cazul definirii unei variabile(lambda <p-list> <expr>)
unde <p-list>
este o lista de parametri formali ai functiei, iar <expr>
este corpul functiei. (lambda (x y) (+ x y))
(define f (lambda (x y) (+ x y)))
(define <f-list> <expr>)
, unde <f-list>
desemneaza o lista al carui prim element este numele functiei, iar elementele urmatoare sunt parametrii functiei si <expr>
desemneaza corpul functiei:(define (f x y) (+ x y))
(f 1 2)
f
ce primeste n
parametrii este in forma:(lambda (x1) (lambda (x2) (… (lambda(xn) <expr>)…)
(lambda (x1 x2 … xn) <expr>)
(cons 1 '(2 3))
(car '(1 2 3))
, (cdr '(1 2 3))
, (caar '(1 2 3))
, (cddr '(1 2 3))
(empty? '(1 2 3))
si (empty? '())
(eq? 1 2)
(if <bool-expr> <expr1> <expr2>)
unde <bool-expr>
este un sub-program care se evalueaza la o valoare booleana (#t
(true), #f
(false)), iar <expr1>
, <expr2>
sunt expresii.map
, filter
, foldl
, foldr
sunt disponibile si functioneaza (aproape) la fel ca in Haskell.(foldl cons '() '(1 2 3))
(foldr cons '() '(1 2 3))
Rezolvati urmatoarele exercitii (folosind, pe cat posibil, functii de ordin superior):
'(1 (2 3 (4 5) 6) 7 (8 9))
⇒ '(1 2 3 4 5 6 7 8 9)
'(1 1 1 1 1 2 2 2 3 4 5)
⇒ '(
(1 1 1 1 1) (2 2 2) (3) (4) (5)
)
.<element,nr_aparitii>
. '(1 1 1 1 1 2 2 2 3 4 5)
⇒ '(
(1 4) (2 3) (3 1) (4 1) (5 1)
)
.<element,nr_aparitii>
.'(1 2 3 1 4 2 2 5)
⇒ '(
(1 2) (2 3) (3 1) (4 1) (5 1))
)
.n
pozitii la stanga/dreapta a unei liste:3
pozitii la stanga pentru '(1 2 3 4 5 6 7)
produce '(4 5 6 7 1 2 3)