A Cecil programozási nyelv

A closure típus

A closure típus

A closure típus segítségével tulajdonképpen egy programblokkot tudunk átadni paraméterként. Closure típusú objektumot closure konstruktorral lehet létrehozni, aminek a következő a szintaxisa:

closure_expr ::= [ ``&'' ``('' [closure_formals] ``)'' ] ``{'' body ``}''
closure_formals::= closure_formal { ``,'' closure_formal }
closure_formal ::= [name] -- formal names are optional, if never referenced

Ez valójában nem más, mint egy metódus deklaráció, azzal a különbséggel, hogy a method kulcsszó és az üzenet nevét a & szimbólummal helyettesítjük (a tervezők a λ szimbólumra akarnak utalni). Ha a closure objektumnak nincs argumentuma, akkor a &() elhagyható, és ilyenkor leírva pont úgy néz ki az objektum, ahogy egy programblokk. Amikor kiértékelődik, a closure konstruktor két dolgot készít:

  1. egy closure objektumot, amely örököl az előre definiált closure objektumtól; az új objektum a konstruktor visszatérési értéke, és
  2. egy új eval nevű metódust, amely az újonnan létrejött closure objektumra van specializálva (ez az első argumentuma), a többi argumentuma pedig a closure objektum argumentumai.

Ugyanúgy ahogy a beágyazott metódus deklarációknál, a closure eval metódusának törzse lexikálisan a konstruktor kiértékeléskor aktív szkópba van ágyazva. Ugyanakkor, ellentétben a beágyazott metódussal, az eval metódus globálisan látható (pontosan addig, amíg a megfelelő closure objektum elérhető) Így egy closure objektum meghívható a lexikálisan bennfoglaló blokk befejezése után is.

A closure típus lehetőséget ad arra, hogy felhasználói szinten valósítsunk meg különböző programkonstrukciókat. Ezért a nyelv készítői nem is szorították meg a nyelvet, és a loop primitív metódus kivételével minden programkonstrukciót a standard könyvtárban valósítottak meg, meghagyva a lehetőséget arra, hogy bárki újabbakkal egészítse ki, vagy esetleg más konstrukciókat használjon.

Példaként tekintsük át, hogy a Cecil standard könyvtárában milyen kivételkezelő konstrukciókat valósítottak meg.