(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
5.prednáška
vlastnosti
(putprop <symbol> <value> <property>)
nastaví vlastnosť <property> symbolu <symbol> na hodnotu <value>(getprop <symbol> <property>)
vráti hodnotu vlastnosti <property> symbolu <symbol>, štandartne majú všetky vlastnosti hodnotu nil.
[] (putprop 'fero 10 'age) 10 [] (putprop 'fero 2500 'weight) 2500 [] (putprop 'fero 'elephant 'kind) elephant [] (getprop 'fero 'weight) 2500 [] (getprop 'fero 'address) ()
Viacnásobná reprezentácia abstraktných dát
reprezentácia komplexných čísel
| x + i * y = r * cis u | ==> | x = r * cos u y = r * sin u r = sqrt(x^2 + y^2) u = atan(y/x) |
úrovne abstrakcie
| program | |||
| komplexné čísla | |||
| +c, -c, *c, /c | |||
| aritmetika komplexných čísel | |||
| make-rect | real, img, mag, angle | make-polar | |
| vektorová reprezentácia | polárna reprezentácia | ||
nevýhody:
vylepšenie manifestovaného typu pomocou tabuľky - odstránenie prvej nevýhody, väcšia modularita
| rect | polar | |
|---|---|---|
| real | real-rect | real-polar |
| img | img-rect | img-polar |
| mag | mag-rect | mag-polar |
| angle | angle-rect | angle-polar |
pridať nový objekt znamená pridať (naplniť) nový stĺpec tabuľky
správcavšeobecná aritmetika
úrovne abstrakcie
| aritmetika | ||||
| add, sub, mul, div | ||||
| generická aritmetika | ||||
| +, -, *, / | +c, -c, *c, /c | |||
| reálna aritmetika |
komplexná aritmetika | |||
| make-rect | real, img, mag, angle | make-polar | ||
| vektorová reprezentácia | polárna reprezentácia | |||
tabuľka operátorov a typov
| real | complex | |
|---|---|---|
| add | +number | +complex |
| sub | -number | -complex |
| mul | *number | *complex |
| div | /number | /complex |
komplexné čísla vo všeobecnej aritmetike
komplexné číslo x + yi je reprezentované (bodkovým)
zoznamom '(complex rect x . y);
komplexné číslo r + cis u je reprezentované (bodkovým)
zoznamom '(complex polar r . u)
Príklad:
(1 + 1i) + (1 + 2i) =
(add (complex rect 1 . 1) (complex rect 1 . 2)) =
(+complex (rect 1 . 1) (rect 1 . 2)) =
(make-complex (+c (rect 1 . 1) (rect 1 . 2))) =
(make-complex (make-rect (+ (real (rect 1 . 1)) (real (rect 1 . 2)))
(+ (img (rect 1 . 1)) (img (rect 1 . 2))))) =
(make-complex (make-rect (+ 1 1) (+ 1 2))) =
(make-complex (make-rect 2 3)) =
(make-complex (rect 2 . 3)) =
(complex rect 2 . 3)
primitívne typy vo všeobecnej aritmetike
pretože k primitívnym typom už existujú v prostredí testy (napr. number?), tieto typy sa môžu zaobísť bez nálepiek
všeobecná aritmetika nad rôznymi typmi
| real | complex | |
|---|---|---|
| real | real->complex | |
| complex |
| real | complex | |
|---|---|---|
| up | real->complex |
operácia nad rôznymi typmi sa môže vykonať, len ak
majú tieto typy spoločný nadtyp;
v takom prípade treba nájsť najmenší spoločný nadtyp
a vstupné objekty naň previesť
pri manifestovanom type boli "inteligentné"
operátory, ktoré sa rozhodovali podľa typu;
pri posielaní správ sú "inteligentné" typy, ktoré
sa rozhodujú podľa operátoru
Last Updated on 26-Oct-2000
By Petrovic Pavol
E-mail: ppetrovi@dent.ii.fmph.uniba.sk