Symbolické programovanie a LISP, zima 2000/2001

(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

6.prednáška

Model prostredí

príklad:

[] (define x 3) x
[] (define y 2) y
[] (let ((x *) (z 3)) (x 2 z)) 6
[] (let ((y 5) (z *)) (list x y z)) (3 5 *)
[] x 3
[] y 2
[] z #<undefined>


set!

(set! <variable> <value>)

[] (define a 3) a
[] a 3
[] (set! a 4) #<undefined>
[] a 4

pravidlá

  1. existuje koreň stromu, globálne prostredie, v ktorom sa (väčšinou) vyhodnocujú S-výrazy z príkazového riadku,
  2. ak sa premenná v danom prostredí nenachádza, jej hodnota sa zisťuje v nadriadenom (rodičovskom) prostredí - rekurzívne,
  3. vyhodnocovanie funkcie je viazané na konkrétne prostredie, t.j.
    funkcia si uchováva aj informáciu o prostredí, v ktorom sa má vyhodnocovať jej aplikácia,

vyhodnocovanie S-výrazov

  1. jednoduché S-výrazy
    1. číslo -> číslo,
    2. symbol -> S-výraz s ním asociovaný,
  2. zložité S-výrazy (S0 S1 ... Sn)
    1. primitívy,
    2. funkcie -
      postup vyhodnocovania:
      1. pod prostredím, na ktoré je viazaná funkcia (eval S0), sa vytvorí potomok, nové prostredie,
      2. v novom prostredí sa vytvoria väzby medzi formálnymi argumentami funkcie (eval S0) a S-výrazmi (eval S1), ... (eval Sn),
      3. v novom prostredí sa vyhodnotí telo funkcie (eval S0)

príklad funkcie square

[] (square 3) 9

S-výraz "(* x x)" sa vyhodnotí v prostredí env1,


príklady

[] (square-sum 2 -1) 5

poznámka: Zámerne sa vynechalo vyhodnocovanie funkcie +, kedže jej definícia nie je dostupná - tento prístup sa uplatní aj pri dalších príkladoch.

[] (fact 3) 6


banka1

nevýhoda: Premenná account je definovaná v globálnom prostredí, takže je voľne prístupná komukoľvek, čo pri bankových operáciách nie je vhodné.


banka2

[] (withdraw2 50) 950


banka3

[] (define withdraw3
       (create-account1 1000))
withdraw3

[] (withdraw3 50) 950


banka4

[] (define withdraw4
       (create-account2 1000)
withdraw4
[] (withdraw4 50) 950

Spolu s aktuálnou výškou konta je v prostredí uložená aj počiatočná výška.


banka5

[] (define account1
       (create-account3 1000))
account1

[] ((account1 'withdraw) 50) 950


banka6

Uvedený program (samozrejme) stále nezodpovedá požiadavkám spoľahlivého a bezpečného bankového programu.

vylepšenia:

 

Last Updated on 09-Nov-2000
By Petrovic Pavol
E-mail: ppetrovi@dent.ii.fmph.uniba.sk