Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
JUI - 2. přednáška Základní funkce, definice funkcí RNDr. Jiří Dvořák, CSc. dvorak@uai.fme.vutbr.cz
2
2 Speciální funkce QUOTE (quote S-výraz) Funkce quote je speciální identita - vyhodnocovací systém ví, že nemá vyhodnotit její argument, takže jí předá nedotčený S-výraz a ona jej vrátí jako svůj výsledek. Tato identita se může zkráceně zapsat pomocí apostrofu podle následujícího vztahu 'S-výraz (quote S-výraz).
3
3 Speciální funkce SETQ (setq proměnná forma) Funkce setq je analogií příkazu přiřazení z imperativních jazyků. Prvý argument funkce setq je proměnná, která se nevyhodnocuje. Druhý argument je forma, která se vyhodnotí a její hodnota se naváže na uvedenou proměnnou. Tato hodnota je také výsledkem aplikace funkce setq. Pomocí setq je možné zajistit vazbu více proměnných. Vyhodnocování a navazování se v tomto případě provádí postupně. Výslednou hodnotou je hodnota poslední formy. (setq prom1 forma1... promN formaN)
4
4 Primitivní funkce CAR CDR CONS ATOM EQ zjišťování částí S-výrazů konstrukce S-výrazů predikátové funkce
5
5 Funkce CAR a CDR (car forma) Hodnotou argumentu musí být tečka-dvojice a hodnotou funkce car je pak první prvek této dvojice. Při aplikaci na neprázdný seznam dostaneme první prvek seznamu. CAR … Contents of Address Register (cdr forma) Hodnotou argumentu musí být tečka-dvojice a hodnotou funkce cdr je pak druhý prvek této dvojice. Při aplikaci na neprázdný seznam dostaneme zbytek seznamu. CDR … Contents of Decrement Register Tyto funkce nemají destruktivní charakter - původní S-výraz zůstává zachován. Existují také složené funkce tvaru cxx…xr, kde místo x může být a (zastupuje car) nebo d (zastupuje cdr). Příslušné funkce se aplikují zprava doleva.
6
6 Funkce CONS (cons forma1 forma2) Hodnotami argumentů mohou být libovolné S-výrazy. Hodnotou funkce cons je tečka-dvojice vytvořená z prvého a druhého S- výrazu. Provedení funkce cons znamená vytvoření nové cons-buňky, obsahující ukazatele na buňky reprezentující uvedené S-výrazy.
7
7 Funkce ATOM a EQ (atom forma) Hodnotou argumentu může být libovolný S-výraz. Funkce atom testuje, zda tato hodnota je atom, t.j. číslo nebo symbol, a v tom případě má hodnotu T. V opačném případě má tato funkce hodnotu nil. (eq forma1 forma2) Hodnotami argumentů musejí být atomy. Funkce eq testuje, zda tyto hodnoty jsou shodné atomy a v tom případě nabývá hodnotu T. Pokud hodnotami argumentů jsou různé atomy, je výsledkem nil.
8
8 Speciální funkce COND (cond (test1... výsledek1) (test2... výsledek2)... (testN... výsledekN)) Tato funkce zajišťuje větvení výpočtu, tedy výběr z několika alternativ v závislosti na splnění zadaných podmínek. Každá alternativa je vyjádřena seznamem forem, kterému říkáme klauzule.
9
9 Vyhodnocení formy COND Speciální forma cond se vyhodnocuje tak, že se postupně vyhodnocují testy na začátku klauzulí, až se nalezne první s hodnotou různou od nil. Pro tuto klauzuli se vyhodnotí i ostatní výrazy v ní obsažené a hodnota posledního z nich je výsledkem celé formy cond. Pokud se při vyhodnocení nenalezla žádná úspěšná klauzule, je výsledná hodnota nil. Speciálním případem klauzule může být i seznam obsahující pouze jediný výraz - tento výraz pak slouží současně jako podmínka i jako výsledek.
10
10 Aritmetické a relační operace Aritmetické operace: +, –, *, / Relační operace: =,, =, /= (nerovno) Výrazy s těmito operacemi je třeba zapisovat v prefixovém tvaru.
11
11 Speciální funkce DEFUN (defun jméno-funkce (par1 par2... parN) výraz1 výraz2... výrazM ) Speciální funkce defun zajišťuje definování nových funkcí. Při aplikaci takto definované funkce se nejprve vyhodnotí argumenty a jejich hodnoty se naváží na proměnné uvedené v h1avičce. Potom se postupně vyhodnocují výrazy uvedené v těle funkce a hodnota posledního z nich je výsledkem aplikace. Po skončení aktivace funkce se zruší lokálně platné vazby argumentů a obnoví se platnost vazeb z (dynamicky) nadřazeného prostředí.
12
12 Volné a vázané proměnné Při definici funkce nemusí výrazy v těle funkce obsahovat jen proměnné reprezentující argumenty (tzv. vázané proměnné, v terminologii imperativního programování jsou to formální parametry funkce). Takové proměnné, použité v těle funkce, které nejsou vázané, mohou zajišťovat závislost funkce na globálně nastavených hodnotách, a jsou vlastně vedle argumentů dalším nástrojem komunikace funkce s jejím okolím. Tyto proměnné nazýváme volnými proměnnými dané funkce (v terminologii imperativního programování to jsou nelokální proměnné). Toto rozlišení se v Lispu netýká jen argumentů při definici funkcí pomocí defun, ale také všech dalších lispovských konstrukcí, které zavádějí proměnné s lokálně vymezeným rozsahem platnosti (např. speciální funkce let).
13
13 Určení vazby volné proměnné Statické určení: Funkce si při své aktivaci přináší vazbu volné proměnné z globálního prostředí. Dynamické určení: Vazba volné proměnné se zjišťuje až v místě volání podle nejblíže nadřazeného prostředí, které tuto volnou proměnnou váže. Pro Lisp je typické dynamické určení rozsahu, avšak některé varianty Lispu (např. jazyk Scheme) používají statické určení rozsahu, neboť to umožňuje efektivnější kompilaci funkcí. Používání volných proměnných nevytváří předpoklady pro srozumitelnou a modulární strukturu programů.
14
14 Programování rekurzivních funkcí Pro číselný argument testujeme rovnost nule nebo jedné, případně i zápornou hodnotu argumentu; do rekurzivní větve dáváme zmenšenou hodnotu argumentu (typicky o hodnotu jedna), obecně hodnotu bližší triviální alternativě. Pro seznam zpracovávaný jen v nejvyšší úrovni testujeme zda seznam je prázdný a argument redukujeme na cdr, případně i více. Pro obecně strukturovaný S-výraz testujeme většinou jako zvláštní případy prázdný seznam a atom (v tomto pořadí) a argument redukujeme na car i cdr.
15
15 Rozšíření možností definice funkcí Volitelné parametry (defun jm-fce (p1 … &optional o1 …) výraz1 …) Pokud při volání funkce není pro volitelný parametr zadán argument, naváže se na něj hodnota nil. Chceme-li, aby se na parametr oi navázala implicitní hodnota daná výrazem výri, musíme v definici funkce zadat takto (oi výri). Proměnný počet argumentů (defun jm-fce (p1 … pN &rest r) výraz1 …) Při volání funkce je nutno zadat alespoň N argumentů. Hodnoty prvých N argumentů se navážou na parametry p1, …, pN. Z hodnot zbývajících argumentů se vytvoří seznam, který se naváže na parametr r. Je-li zadáno právě N argumentů, naváže se na parametr r hodnota nil.
16
16 Rozšíření možností definice funkcí Parametry označené klíčovými slovy (defun jm-fce (p1 … &key ks1 …) výraz1 …) Pokud při volání funkce chceme zadat argument odpovídající parametru ksi, musíme napsat :ksi argument. Není li pro některý z parametrů ksi žádný argument zadán, naváže se na něj hodnota nil. Chceme-li, aby se na parametr ksi navázala implicitní hodnota daná výrazem výri, musíme v definici funkce napsat (ksi výri). Pomocné proměnné (defun jm-fce (p1 … &aux (a1 výr1) …) výraz1 …) Pomocné proměnné představují lokální proměnné, na které se při volání funkce navazují hodnoty zadané výrazy výr1, ….
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.