(vychádza z prednášky
Funkcionálne programovanie, Ivan Kalaš)
Petrovič Pavol, Ústav Informatiky, č.d. 15
e-mail: ppetrovi@dent.ii.fmph.uniba.sk
www k prednáške: http://www.ii.fmph.uniba.sk/vyuka/lisp
3.prednáška
Abstrakcia dát
znamená oddeliť
požitie dát
reprezentácia dát
Napríklad funkcia linear-combination fungujúca pre ľubovoľné (číselné) objekty nepozná a nepoužíva vnútorné informácie o reprezentácii týchto objektov.
racionálne čísla
n1/d2 + n2/d2 = (n1 d2 + d1 n2)/(d1 d2)Funkcie nemajú žiadne predpoklady o dátach (zlomkoch), používajú "interface" pozostávajúci z konštruktorov (make-rat) a selektorov (numer, denom).
páry - cons, car, cdr
zlomky ako páry
[] (define p (cons 1 2)) p [] (car p) 1 [] (cdr p) 2
[] (define one-half (make-rat 1 2)) one-half [] (print-rat one-half) 1/2 [] (define one-third (make-rat 1 3)) one-third [] (print-rat (rat+ one-half one-third)) 5/6 [] (print-rat (rat* one-half one-third)) 1/6 [] (print-rat (rat+ one-third one-third)) 6/9
Úrovne abstrakcie
Ak je nutné modifikovať program (napríklad aby vytváral zlomky v základnom tvare), stačí opraviť "interface" = vymeniť zásuvku - tzv. zásuvková metóda. Vyššie úrovne zostávajú nezmenené.
program s racionálnymi číslami |
rat |
rat+, rat-, rat*, rat/, rat=? |
aritmetika nad racionálnymi číslami |
make-rat, numer, denom |
racionálne čísla ako páry |
cons, car, cdr |
ľubovoľná implementácia párov |
Implementácia každej "zásuvky" môže byť rôzna (závisí od špecifikácie programu). Musí ale spĺňať podmienky pre ňu dané. Napríklad:
x = (make-rat n d) | ---> | (numer x)/(denom x) = n/d |
z = (cons x y) | ---> | (car z) = x; (cdr z) = y |
(cons 1 2)
[] (define z1 (cons (cons 1 2) 3)) z1 [] (define z2 (cons 1 (cons 2 3))) z2 [] (cdr z1) 3 [] (car (car z1)) 1 [] (cdr (car z1)) 2 [] z1 ((1 . 2) . 3)
vlastné zoznamy
obsahujú zakončenie - "nil" - ()
(list <o1> <o2> ... <on>) = (cons <o1> (cons <o2> ... (cons <on> ()) ... ))
[] (define 1az4 (list 1 2 3 4)) 1az4 [] 1az4 (1 2 3 4) [] (car 1az4) 1 [] (cdr 1az4) (2 3 4) [] (cons 10 1az4) (10 1 2 3 4) [] (cons 1 (cons 2 (cons 3 4))) (1 2 3 . 4)
[] (null? (list 1 2)) () [] (null? (cdr (list 1 2))) () [] (null? (cddr (list 1 2))) #T
stromy
(cons (list 1 2) (list 1 2)) ((1 2) 1 2)
(list (list 1 2) (list 1 2)) ((1 2) (1 2))
atom? je predikát, ktorý zistí, či jeho argument je zložený S-výraz (zoznam, dvojica) alebo jednoduchý (číslo, symbol)
quote '
[] (define a 1) a [] (define b 2) b [] (list a b) (1 2) [] (list 'a 'b) (a b) [] (list a 'b) (1 b) [] '(a b) (a b)
'<x> = (quote <x>)
quote zastaví vyhodnocovanie argumentu
eval
(eval <S-exp>)
eval vynúti vyhodnotenie <S-exp>
Kedže prvýkrát sa vstupný S-výraz vyhodnotí ako argument funkcie (pozri vyhodnocovanie S-výrazov), výsledkom je S-výraz vyhodnotený dvakrát - druhýkrát funkciou eval.
[] + #<proc +> [] '+ + [] ''+ (quote +) [] (eval +) #<proc +> [] (eval '+) #<proc +> [] (eval ''+) + [] (eval '(+ 2 3)) 5
porovnávanie - eq?, equal?
(eq? <o1> <o2>)
(equal? <o1> <o2>)
[] (eq? 1 1) ??? [] (eq? 'ahoj 'ahoj) #T [] (eq? (cons 1 2) (cons 1 2) () [] (define x (cons 1 2)) x [] (eq? x x) #T [] (equal? 1 1) #T [] (equal? 'fero 'fero) #T [] (equal? (cons 1 2) (cons 1 2)) #T [] (eq? x 'ahoj) () [] (equal? 'a 'ahoj) ()
Last Updated on 19-Oct-2000
By Petrovic Pavol
E-mail: ppetrovi@dent.ii.fmph.uniba.sk