Jazyk Scheme: jeho syntax a sémantika

Podobné dokumenty
Paradigmata programování 1

Paradigmata programování 1

Paradigmata programování 1

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ

Paradigmata programování 1

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Programovací jazyk Pascal

Paradigmata programování 1

IB015 Neimperativní programování. Organizace a motivace kurzu, programovací jazyk Haskell. Jiří Barnat

PARADIGMATA PROGRAMOVÁNÍ 2A INTERPRET S VEDLEJŠÍMI EFEKTY A MAKRY

1. Od Scheme k Lispu

Funkcionální programování. Kristýna Kaslová

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Algoritmus. Cílem kapitoly je seznámit žáky se základy algoritmu, s jeho tvorbou a způsoby zápisu.

Paradigmata programování 2

Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem.

Sdílení dat mezi podprogramy

Základy algoritmizace

TÉMATICKÝ OKRUH Softwarové inženýrství

3 Co je algoritmus? Trocha historie Definice algoritmu Vlastnosti algoritmu... 3

Přednáška 3: Limita a spojitost

ALGORITMIZACE A PROGRAMOVÁNÍ

Teoretická informatika Tomáš Foltýnek Algebra Struktury s jednou operací

Vlastnosti algoritmu. elementárnost. determinovanost. rezultativnost. konečnost. hromadnost. efektivnost

Algoritmizace. Obrázek 1: Přeložení programu překladačem

Paradigmata programování II Přednáška 1: Vedlejší efekt

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Úvod. Programovací paradigmata

Úvod do programovacích jazyků (Java)

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Zadání semestrálního projektu Algoritmy II. letní semestr 2017/2018

Algoritmizace prostorových úloh

Překladač a jeho struktura

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

NPRG030 Programování I, 2015/16 1 / :25:32

Algoritmizace a programování

Je n O(n 2 )? Je n 2 O(n)? Je 3n 5 +2n Θ(n 5 )? Je n 1000 O(2 n )? Je 2 n O(n 2000 )? Cvičení s kartami aneb jak rychle roste exponenciála.

IB111 Úvod do programování skrze Python Přednáška 13

Deskripční logika. Petr Křemen FEL ČVUT. Petr Křemen (FEL ČVUT) Deskripční logika 37 / 157

Struktura programu v době běhu

NPRG030 Programování I, 2018/19 1 / :25:37

Maticí typu (m, n), kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru:

Algoritmy a algoritmizace

PB161 programování v C++ Výjimky Bezpečné programování

Algoritmus pro hledání nejkratší cesty orientovaným grafem

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Funkcionální programování úvod

Vizuální programování

VISUAL BASIC. Přehled témat

4.2 Syntaxe predikátové logiky

Substituce. Petr Štěpánek. S využitím materialu Krysztofa R. Apta. Logické programování 2 1

ADT STROM Lukáš Foldýna

ZÁPOČTOVÁ PRÁCE z UIR

Programování v jazyce C pro chemiky (C2160) 12. Specifické problémy při vývoji vědeckého softwaru

Datové struktury 2: Rozptylovací tabulky

Funkce, elementární funkce.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Objektové programování

Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

Kapitola 13: Transakce. Koncept transakce. ACID vlastnosti

KOMPLEXNÍ ČÍSLA INVESTICE DO ROZVOJE VZDĚLÁVÁNÍ

Naproti tomu gramatika je vlastně soupis pravidel, jak

DTP Základy programování Úvod do předmětu

Praktické využití Mathematica CalcCenter. Ing. Petr Kubín, Ph.D. Katedra elektroenergetiky, ČVUT v Praze, FEL

Algoritmizace a programování

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

6. DIFERENCIÁLNÍ POČET FUNKCE VÍCE PROMĚNNÝCH

4a. Makra Visual Basic pro Microsoft Excel Cyklické odkazy a iterace Makra funkce a metody

popel, glum & nepil 16/28

1. D Y N A M I C K É DAT O V É STRUKTUR Y

NPRG030 Programování I, 2010/11

Vývojové diagramy 1/7

Základní datové struktury III: Stromy, haldy

Algoritmizace a programování

Programujeme v softwaru Statistica

Množiny, relace, zobrazení

Unární je také spojka negace. pro je operace binární - příkladem může být funkce se signaturou. Binární je velká většina logických spojek

5 Orientované grafy, Toky v sítích

Funkce, podmíněný příkaz if-else, příkaz cyklu for

Je možné efektivně používat procesně orientované pracovní postupy při zdravotní péči?

Procesy a vlákna (Processes and Threads)

8. přednáška z předmětu GIS1 Rastrový datový model a mapová algebra

Paměť počítače. alg2 1

Algoritmizace- úvod. Ing. Tomáš Otáhal

AUTOMATY A GRAMATIKY. Pavel Surynek. Kontextové uzávěrové vlastnosti Turingův stroj Rekurzivně spočetné jazyky Kódování, enumerace

Úvod do informatiky. Miroslav Kolařík

NPRG030 Programování I, 2016/17 1 / :58:13

Hisab al-džebr val-muqabala ( Věda o redukci a vzájemném rušení ) Muhammada ibn Músá al-chvárizmího (790? - 850?, Chiva, Bagdád),

Výroková logika. Teoretická informatika Tomáš Foltýnek

Výroková a predikátová logika - III

Matematika v programovacích

Architektura procesorů PC shrnutí pojmů

ZKUŠENOSTI S AUTOMATIZACÍ CITAČNÍ ANALÝZY NA ZAKONECHPROLIDI.CZ. Pavel Gardavský/AION CS, s.r.o

Úvod do informatiky. Miroslav Kolařík. Zpracováno dle učebního textu R. Bělohlávka: Úvod do informatiky, KMI UPOL, Olomouc 2008.

ZÁKLADY PROGRAMOVÁNÍ. Mgr. Vladislav BEDNÁŘ , 5.1 a 5.2 8/14

Vyřešené teoretické otázky do OOP ( )

Stonožka jak se z výsledků dozvědět co nejvíce

Transkript:

Jazyk Scheme: jeho syntax a sémantika Vilém Vychodil, vilemvychodil@upolcz Syntaxe Scheme program v jazyku Scheme = konečná posloupnost symbolických výrazů symbolický výraz(s-výraz/ symbolic expression/ S-expression) = výraz definovaný použitím následujících bodů: 1 každé číslo je symbolický výraz(zapisujeme 12,-10, 2/3, 1245, 432e-20,-5i, 2+3i, a pod) 2 každý symbol je symbolický výraz(zapisujeme sqrt, +, quotient, even?, muj-symbol, ++?4tt, a pod) 3 jsou-li E 1,E 2,,E n symbolickévýrazy(n 1),pak(E 1 E 2 E n )jesymbolickývýrazzvanýseznam, E 1,E 2,,E n senazývajíprvkyseznamu(e 1 E 2 E n ) Příklady: následující jsou symbolické výrazy: 3141459, 10245, 1+, list?, vector->list,(= 1 2), (* 2 (sqrt (/ 2 3))),(1 + 2),(2+ (3 + 3)),((10) (20)),(1 (ahoj (3))),apod následujícínejsousymbolickévýrazy:),(+ 1 2)),(10 (20 ahoj),apod Sémantika Scheme(interpretace S-výrazů) Interprety nepracují s S-výrazy přímo, to jest ve formě sekvence znaků, ale převádějí je vždy do své interní reprezentace, která je pro ně efektivní Například malé číslo-123 je reprezentováno datovým typem integer, pro který je základní aritmetika implementována rovnou na procesoru Stejně tak například seznam(+ 1 (* 2 3)) je reprezentován efektivní strukturou(lineárním dynamickým spojovým seznamem) S-výraz převedený do interní reprezentace budeme nazývat element jazyka Kromě interních reprezentací S-výrazů existují ještě další elementy jazyka Jedněmi z nich jsou například procedury(například aritmetické procedury pro sčítání, odčítání, mocnění čísel, procedury pro vstupně/ výstupní operace a podobně) Množina všech elementů jazyka spolu s pravidly jejich vzájemného vyhodnocování tvoří základní model abstraktního interpretu jazyka Scheme Interpretace programu probíhá v cyklu REPL(Read, Eval, Print, Loop): Read: Načtení prvního vstupního S-výrazu E a převedení do vnitřní(efektivní) reprezentace, kterou používá interpret, hovoříme o interní reprezentaci S-výrazu Interní reprezentaci S-výrazu E budeme označovat E Interpret dáleprovádívšechnyúkonynadinterníreprezentacís-výrazůběhemfáze Read jsouodhaloványsyntaktické chyby(neformálněřečeno: chybyvzápisus-výrazů ) Eval: Vstupem je interní reprezentace E vstupního S-výrazu E Výstupem je element jazyka F, který vznikne vyhodnocením E (viz dále) Pokud je F vyhodnocením E, tento fakt zapisujeme F = Eval[ E ] Print: Provede se převod elementu F, vzniklého v předchozím kroku, na jeho externí reprezentaci, což je pro člověka čitelný S-výraz Externí reprezentaci F značíme F Vzniklý S-výraz F je vypsán Loop:OdebereseS-výraz Ezevstupuapokudjevstupneprázdný,pokračujemekrokem Read Procedury Read, Print a Loop jsouvíceménětriviálnínutnéjepřesněspecifikovat Eval Bezznalosti Eval neznáme interpretaci S-výrazů a tím pádem bychom neznali sémantiku(význam) jazyka Potřebné pojmy: výpočetní proces je generován programem pomocí postupné aplikace procedur(funkcí) procedury=(speciální)elementyjazykascheme(vnašíterminologiije procedura totéžco funkce ) aplikace procedury(někdy též aktivace procedury) = provedení dané procedury nad danými argumenty, výsledkem aplikaceproceduryjebuď CHYBA:Procedurunelzeaplikovatsdanýmiargumenty,nebovýslednýelement(výsledná hodnota) argumenty = elementy jazyka, které jsou při aktivaci předány proceduře(procedura používá argumenty ke stanovení výsledného elementu) Příklad:Aplikacíprocedury sčítáníčísel naargumenty1,10a-30jevýslednáhodnota-19aplikacíprocedury zjisti zda-lijedanéčíslosudé naargument127je CHYBA:Vstupníargumentmusíbýtceléčíslo Poznámka: nyní již známe dva typy elementů jazyka: interní reprezentace S-výrazů(viz výše) a procedury

Připostupnéaplikaciprocedur(kterájeprováděnavčásti Eval cyklurepl)hrajídůležitourolisymbolyvyskytujícíse v S-výrazech, které vyhodnocujeme Symboly se využívají(mimo jiné) k pojmenování procedur Například intuitivně očekáváme,žesymbol+uvedenývprogramubudezastupovat proceduruprosčítání Upozorněmevšaknafakt,že symbol je něco jiného než procedura samotná: symbol je S-výraz, kdežto procedura je element jazyka dvě naprosto odlišné věci Při interpretaci programu máme dány vazby symbolů na procedury, respektive obecněji, vazby symbolů na elementy Tyto vazby jsou definovány v tabulce zvané prostředí Prostředí je tabulka tvaru: symbol element E 1 F 1 E 2 F 2 E k F k kde E 1,E 2, jsousymbolyaf 1,F 2, jsouelementy Pokudjesymbol Euvedenvtabulcevlevémsloupci,pakhodnotěvpravémsloupcinatémžeřádkuříkámeaktuální vazba symbolu E v prostředí Na počátku interpretace jsou v prostředí(počátečním prostředí) dány počáteční vazby, například aktuální vazbou symbolu + je procedura pro sčítání čísel, aktuální vazbou symbolu sqrt je procedura druhéodmocniny,apodpokudsymbol Eneníuvedenvlevémsloupci,pakříkáme,že Enemávazbuvprostředí Nynímůžemepopsatvyhodnocovánívýrazů(tojestčást Eval cyklurepl) Mějme S-výraz E Výsledek vyhodnocení(interní reprezentace) S-výrazu E, značeno Eval[ E ], je definován: (A) Pokud je E číslo, pak nastavíme hodnotu Eval[ E ] na E, což zapisujeme Eval[ E ]:= E (Slovně: každé číslo se vyhodnotí na sebe samo) (B) Pokudje Esymbol,mohounastatdvěsituace: (B1) Pokud Emáaktuálnívazbu F,paknastavímeEval[ E ]:= F (Slovně: pokud má symbol aktuální vazbu, pak je vyhodnocením symbolu jeho aktuální vazba) (Be) Pokud Enemáaktuálnívazbu,skončímevyhodnocováníhlášením CHYBA:Symbol Enemávazbu (C) Pokudje Eseznamtvaru(E 1 E 2 E n ),paknejprveprovedemevyhodnoceníprvníhoprvku E 1 avýslednou hodnotuoznačíme F 1,cožbudemezapisovat F 1 :=Eval[ E 1 ]Mohounastatdvěsituace: (C1) Pokud F 1 (elementvzniklývyhodnoceníminterníreprezentace E 1 )jeprocedura,paksevnespecifikovaném pořadívyhodnotízbyléprvky E 2,,E n seznamu E,výsledkyjejichvyhodnoceníoznačíme F 2,,F n Formálně: F 2 :=Eval[ E 2 ], F 3 :=Eval[ E 3 ], F n :=Eval[ E n ] Výsledkemvyhodnocení E jepotomelement Fvzniklýaplikacíprocedury F 1 naargumenty F 2,, F n, zapisujemeeval[ E ]:=Apply[F 1,F 2,,F n ] (Slovně: vyhodnocení seznamu probíhá tak, že je nejprve vyhodnocen jeho první prvek V případě, že se první prvek vyhodnotí na proceduru, se v nespecifikovaném pořadí vyhodnotí ostatní prvky seznamu; potom je procedura aplikována na argumenty, kterými jsou právě výsledky vyhodnocení zbylých prvků seznamu tedy všech prvků kromě prvního) (Ce) Pokud F 1 neníprocedura,skončímevyhodnocováníhlášením CHYBA:Nelzeprovéstaplikaci:prvníprvekseznamu Esenevyhodnotilnaproceduru V dalším textu budeme někdy kvůli přehlednosti ztotožňovat interní reprezentaci S-výrazů se samotnými S-výrazy Pořád jealenutnémítnapaměti,žejdeodvěrůznévěci Příklady: 1 (+ 1 2)sevyhodnotína3Podrobněji:(+ 1 2)jeseznam,tedyvyhodnocovánípostupujedlebodu(C)Vyhodnotíme první prvek seznamu, to jest stanovíme Eval[+] Jelikož je + symbol, postupujeme dle bodu(b) Na symbol + je navázána procedura pro sčítání V bodu(c) tedy postupujeme po větvi(c1) Nyní v nespecifikovaném pořadí vyhodnotímezbyléargumenty1a2obaargumentyjsoučísla,takžeeval[1]=1aeval[2]=2nyníaplikujeme procedurusčítánínaargumenty1a2adostanemevýslednouhodnotu3výsledkemvyhodnocení(+ 1 2)je3

2 (+ (* 3 (+ 1 1)) 20)sevyhodnotína26 3 Vyhodnocení(10 + 20) končí chybou, která nastane v kroku(ce) 4 Vyhodnocení((+ 1 2) (+ 1 3))končíchybou,kteránastanevkroku(Ce) 5 Vyhodnocení((* 2 3 4))končíchybou,kteránastanevkroku(Ce) 6 Vyhodnocení(+ 2 (odmocni 10)) končí chybou, která nastane v kroku(be) 7 Vyhodnocení(* (+ 1 2) (sqrt 10 20))končíchyboupřipokusuoaplikaciprocedury vypočtidruhouodmocninu : CHYBA:Nepřípustnýpočetargumentů Rozšíření Scheme o speciální formy speciální forma = element jazyka Poznámka: nyní již známe tři typy elementů jazyka: interní reprezentace S-výrazů, procedury a speciální formy Speciální formy mají podobný účel jako procedury jejich aplikacemi lze generovat, případně modifikovat, výpočetní proces Zcela zásadně se však od procedur liší v tom, jak probíhá jejich aplikace během vyhodnocování S-výrazů Procedury jsou aplikovány s argumenty, které jsou předem získány vyhodnocením(tedy procedura přísně vzato nemůže zjistit, vyhodnocením jakých symbolických výrazů dané argumenty vznikly) Neformálně řečeno: speciální formy jsou aplikovány s argumenty jimiž jsou S-výrazy(respektive jejich interní reprezentace) v jejich nevyhodnocené podobě a každá speciální forma si sama určuje jaké argumenty a v jakém pořadí(zda-li vůbec) bude vyhodnocovat Přesnou aplikaci speciálních forem zavedeme nyní Propoužitíspeciálníchforemrozšířímebod(C)části Eval cyklureplnásledovně: (C) Pokudje Eseznamtvaru(E 1 E 2 E n ),paknejprveprovedemevyhodnoceníprvníhoprvku E 1 avýslednou hodnotuoznačíme F 1,tojest F 1 :=Eval[ E 1 ]Mohounastattřisituace: (C1) Pokud F 1 jeprocedura,paksepostupshodujes(c1)popsanýmvpředchozísekci (C2) Pokud F 1 jespeciálníforma,pakvýsledkemvyhodnocení E jeelement F vzniklýaplikacíspeciální formy F 1 naargumenty E 2,, E n,zapisujemeeval[ E ]:=Apply[F 1, E 2,, E n ] (Slovně: narozdíl od procedur, speciální formy jsou aplikovány na argumenty jimiž jsou interní reprezentace prvků seznamu E v jejich nevyhodnocené podobě) (Ce) Pokud F 1 neníproceduraanispeciálníforma,skončímevyhodnocováníhlášením CHYBA:Nelzeprovéstaplikaci:prvníprvekseznamu Esenevyhodnotilnaproceduruanispecformu V jazyku Scheme budeme mít vždy snahu mít co možné nejméně(nezbytné minimum) speciálních forem, protože zavádění speciálních forem do jazyka a jejich využívání programátorem je potenciálním zdrojem chyb Důvod je zřejmý: jelikož si každá speciální forma určuje vyhodnocování svých argumentů, na uživatele formy(to jest programátora) to narozdíl od procedur klade další požadavek(pamatovat si, jak se argumenty zpracovávají) Druhý úhel pohledu je více méně epistemický zařazováním nadbytečných forem do jazyka se zvyšuje jeho celková složitost Pojmenování: vytváření abstrakcí pojmenováním hodnot define = speciální forma, která je v počátečním prostředí navázána na symbol define Poznámka: Pokud budeme dále hovořit o speciálních formách, budeme je pro jednoduchost ztotožňovat se symboly, na které jsou navázány v počátečním prostředí Opět je ale nutné si uvědomit, že speciální forma je element jazyka, tedy něco jiného než symbol(s-výraz) Speciální forma define se aktivuje se dvěma argumenty ve tvaru:(define jméno výraz ), přitom forma nejprve ověří zda-li je jméno symbol Pokud tomu tak není, aktivace formy je ukončena hlášením CHYBA: První výraz musí býtsymbol Vopačnémpřípadějevyhodnocen výraz,tojestprovedese F:=Eval[ výraz ]Dálejevprostředí vytvořena nová vazba symbolu jméno na element F Pokud již symbol jméno měl vazbu, tato původní vazba je nahrazena elementem F Speciální forma define má při své aktivaci vedlejší efekt: modifikuje prostředí Výsledná hodnota(define jméno výraz ) je nedefinovaná nedefinovaná hodnota:specifikacejazykaschemer 5 RSneupřesňuje,cojepodpojmem nedefinovanáhodnota myšleno Jednotlivé interprety tuto otázku řeší různě Náš(abstraktní) interpret Scheme ji může vyřešit třeba tak, že nedefinovaná hodnota bude speciální element jazyka, který se bude vyhodnocovat na sebe sama(analogicky jako čísla)

ajehožexterníreprezentacíbude prázdnýřetězec (taktojenedefinovanáhodnotařešenaivinterpretudrscheme amnohadalších) Příklady: 1 Povyhodnocení(define ahoj (* 2 3))senasymbolahojnavážehodnota6 2 Povyhodnocení(define blah +)senasymbolblahnavážehodnota,kterábylanavázanánasymbolu+ 3 Popostupnémvyhodnocení(definetmp +),(define + *),a(define*tmp)sezaměnívazbyna+a* 4 Vyhodnocení(define 10 (* 2 3))končíchybou(10nenísymbol) Vytváření abstrakcí pomocí procedur primitivní procedury = procedury, které jsou na počátku vyhodnocování(po spuštění interpretu) navázány na symboly +,sqrt,modulo, uživatelsky definované procedury = procedury, které lze dynamicky vytvářet během vyhodnocování programů uživatelsky definované procedury vznikají vyhodnocením lambda-výrazů(λ-výrazů) lambda-výrazjes-výrazvetvaru(lambda ( p 1 p n ) tělo ),kde p 1,, p n (n 0)jsouvzájemně různésymbolya tělo jes-výraz; p 1,, p n senazývajíformálníargumenty(parametry) Poznámka:Účelemformálníchargumentůje pojmenovathodnoty sekterýmibudeproceduraaplikována(proceduru můžeme aplikovat s různými argumenty, proto je potřeba je při definici procedury zastoupit symboly, aby byly pokryty všechnymožnostiaplikaceprocedury )Těloprocedurypředstavujevlastnípředpisprocedury neformálněřečeno, tělovyjadřuje cobudeprocedurasdanýmiargumentyprovádět Vazba na pojem prostředí: Při rozšíření interpretu o uživatelsky definovatelné procedury je třeba rozšířit pojem prostředí Už si nevystačíme pouze s jedním prostředím jak tomu bylo doposud, ale během vyhodnocování programu bude obecně existovat celá řada prostředí, které budou mít mezi sebou vazby prostředí P je tabulka vazeb symbolů(jako doposud); každé prostředí(vyjma globálního prostředí, viz dále) má navíc ukazatel na svého předka(předek je opět prostředí) globální(počáteční)prostředí,označujeme P G,jeprostředívekterémjsounastavenypočátečnívazbysymbolůave kterém jsme doposud uvažovali vyhodnocování Globální prostředí nemá předka Jinými slovy, globální prostředí je v hierarchii prostředí úplně na vrcholu Máme-li k dispozici víc prostředí, musíme přesně specifikovat vyhodnocování S-výrazů v daném prostředí Proto rozšíříme Eval následovně:místoeval[ E ]budemepsáteval[ E, P],kde Pjeprostředí;Eval[ E, P]označujevýsledek vyhodnocení(interní reprezentace) S-výrazu E v prostředí P, který definujeme: (A) Pokudje Ečíslo,paknastavímeEval[ E, P]:= E (Slovně: každé číslo se v libovolném prostředí vyhodnotí na sebe samo) (B) Pokudje Esymbol,mohounastatdvěsituace: (B1) Pokud Emávazbu Fvtabulceprostředí P,paknastavímeEval[ E, P]:= F (Slovně:pokudmásymbolvazbuvP,pakjevyhodnocenímsymboluvPtatovazba) (B2) Pokud EnemávazbuvPapokudmá Ppředchůdce P,paknastavímeEval[ E, P]:=Eval[ E, P ] (Slovně: pokud není vazba symbolu nalezena v tabulce prostředí P, pak se vazbu pokusíme hledat v tabulce nadřazeného prostředí) (Be) Pokud EnemávPvazbuapokud Pnemápředchůdce(tojestpokud P= P G ),pakskončímevyhodnocováníhlášením CHYBA:Symbol Enemávazbu (C) Pokudje Eseznamtvaru(E 1 E 2 E n ),paknejprveprovedemevyhodnoceníprvníhoprvku E 1 vprostředí Pavýslednouhodnotuoznačíme F 1,tojest F 1 :=Eval[ E 1, P]Mohounastattřisituace: (C1) Pokud F 1 (elementvzniklývyhodnoceníminterníreprezentace E 1 )jeprocedura,paksevnespecifikovaném pořadívyhodnotízbyléprvky E 2,,E n seznamu Evprostředí P,výsledkyjejichvyhodnoceníoznačíme F 2,,F n Formálně: F 2 :=Eval[ E 2, P], F 3 :=Eval[ E 3, P], F n :=Eval[ E n, P]

Výsledkem vyhodnocení E v P jepotomelement F vzniklýaplikací procedury F 1 na argumenty F 2,, F n,zapisujemeeval[ E, P]:=Apply[F 1,F 2,,F n ] (Slovně: vyhodnocení seznamu v daném prostředí probíhá tak, že je nejprve vyhodnocen jeho první prvek v tomto prostředí V případě, že se první prvek vyhodnotí na proceduru, se v nespecifikovaném pořadí vyhodnotí ostatní prvky seznamu(opět v daném prostředí); potom je procedura aplikována na argumenty, kterými jsou právě výsledky vyhodnocení zbylých prvků seznamu tedy všech prvků kromě prvního) (C2) Pokud F 1 jespeciálníforma,pakvýsledkemvyhodnocení E vpjeelement Fvzniklýaplikacíspeciální formy F 1 naargumenty E 2,, E n,zapisujemeeval[ E, P]:=Apply[F 1, E 2,, E n ] (Slovně: narozdíl od procedur, speciální formy jsou aplikovány na argumenty jimiž jsou interní reprezentace prvků seznamu E v jejich nevyhodnocené podobě) (Ce) Pokud F 1 neníproceduraanispeciálníforma,skončímevyhodnocováníhlášením CHYBA:Nelzeprovéstaplikaci:prvníprvekseznamu Esenevyhodnotilnaproceduruanispecformu VcykluREPLprobíhávyhodnocovánívefázi Eval vprostředí P G (cyklusreplprobíhávglobálnímprostředí) Poznámka:Všimnětesi,žepředchozípopis Eval jsmerozšířilivpodstatějenvelminepatrně oproti Eval pracujícím se speciálními formami jsme pouze přidali bod(b2) zajišťující možnost hledat vazby v nadřazených prostředích; uvšechostatníchvýskytů Eval provádímevyhodnocenívtémžeprostředí PDálesivšimněte,žeaplikace(primitivní) procedury F 1 naargumenty F 2,,F n,cožznačímeapply[f 1,F 2,,F n ],nenízávislánaprostředí Doposud jsme nespecifikovali aplikaci uživatelsky definovatelných procedur To jest, neřekli jsme co je výsledkem provedeníapply[f 1,F 2,,F n ]pokudje F 1 proceduravzniklávyhodnocenímlambda-výrazunatosezaměřímenyní Vyhodnocenímlambda-výrazu(lambda ( p 1 p n ) tělo )vprostředí Pvznikáprocedura,cožjetrojice ( p 1 p n ), tělo, P Trojice ( p 1 p n ), tělo, P jetedyelementjazykaschemereprezentujícíproceduru,kterýseskládázeseznamu formálních argumentů, těla, a prostředí vzniku procedury Prostředí vzniku procedury je prostředí, ve kterémbylvyhodnocendanýlambda-výrazzápisprocedurbudemedálezkracovatna F= V,E, P,kde V jeseznam formálních argumentů a E je tělo Poznámka: Z předchozího je zřejmé, že každá procedura vzniklá vyhodnocením lambda-výrazu si v sobě nese informaci o prostředí, ve kterém vznikla Tato informace bude dále použita při aplikaci procedury, viz dále Mějmedánuuživatelskýdefinovanouproceduru F = V,E, P aargumenty F 1,,F n Aplikaciprocedury F na argumenty F 1,, F n,značenouapply[f,f 1,,F n ],definujemetakto: 1 Předpokládejme,že Vje m-prvkovýseznamsymbolůtvaru(x1 xm)pokudse m(početformálníchargumentů) neshoduje s n(počet argumentů se kterými chceme proceduru aplikovat), pak skonči hlášením CHYBA: Chybný početargumentů,předáno n,očekáváno m Vopačnémpřípaděpřejdinadalšíbod 2 Vytvořísenovéprázdnéprostředí P l,kterénazývámelokálníprostředíprocedury (tabulkaprostředí P l vtomtookamžikuneobsahuježádnévazby) 3 Nastavímepředka P l na P(předkemnovéhoprostředíjeprostředívznikuprocedury F) 4 Vprostředí P l senasymbolyx1,,xnnavážíargumenty F 1,,F n (cožjsouelementyjazyka) 5 PoložímeApply[F,F 1,,F n ]:=Eval[E, P l ] (Slovně:výsledkemaplikaceproceduryjevyhodnocenítěla Evlokálnímprostředí P l ) Výše popsaný princip aplikace procedur odpovídá lexikálnímu rozsahu platnosti symbolů pokud není vazba daného symbolu nalezena v lokálním prostředí procedury, pak je hledána v prostředí vzniku procedury to jest v lexikálně nadřazeném prostředí(prostředí lexikálního předka) Z tohoto důvodu je potřeba uchovat v každé proceduře informaci o prostředí ve kterém vznikla Druhým typem rozsahu platnosti je dynamický rozsah platnosti, který je v současnosti prakticky nepoužívaný Jedinou odlišnosti od předchozího modelu je, že pokud není vazba symbolu nalezena v lokálním prostředí procedury, pak je hledána v prostředí odkud byla procedura aktivována(aplikována), to jest v dynamicky nadřazeném prostředí Pokud bychom chtěli v našem abstraktním interpretu zavést dynamický rozsah platnosti místo lexikálního, stačilo by pouze uvažovat procedury jako dvojice F = V, E (P už si není potřeba pamatovat) Aplikaci procedury bychom museli uvažovatvzhledemkprostředí P A,vekterémjiprovádíme,azměnilibychombod3aplikacenásledovně:

3 Nastavímepředka P l na P A (předkemnovéhoprostředíjeprostředíaplikaceprocedury F) Dálebychomupravili Eval vbodech(c1)a(c2)tak,abysepřikaždéaplikacipředávalainformaceoprostředí P A,vekterémaplikaciprovádíme(tojestvpodobnémduchujakojsmerozšířilisamotnýEvalododatečnýargument reprezentující prostředí, rozšíříme nyní Apply o další argument reprezentující prostředí v tomto případě prostředí aktivace procedury) Poznámka: Implementace dynamického rozsahu platnosti je výrazně jednodušší než implementace lexikálního rozsahu platnosti Proto byl dynamický rozsah platnosti populární v rané fázi vývoje interpretů a překladačů programovacích jazyků Programování s dynamickým rozsahem platnosti však vede k častému vzniku chyb(programátor se musí neustále zamýšletnadtím,odkudbudedanáproceduravolánaajakéjepotřebamítvdanémprostředívazbysymbolů)aproto jej v současnosti nevyužívá skoro žádný programovací jazyk(jedním z mála jazyků s dynamickým rozsahem platnosti, který je v praxi používán je FoxPro) Příklad: Výsledkem vyhodnocení následujícího programu v interpretu jazyka Scheme (define x 100) (define curry+ (lambda(x) (lambda (y) (+ x y)))) ((curry+ 10) 20) je číslo 30 Kdybychom používali dynamický rozsah platnosti, pak by výsledkem vyhodnocení bylo číslo 120, protože procedura vytvořená vyhodnocením lambda-výrazu(lambda (y) (+ x y)) je aplikována z globálního prostředí(s argumentem20),kdemásymbolxvazbu100