160 likes | 252 Views
JUI - 2. přednáška Základní funkce, definice funkcí. RNDr. Jiří Dvořák, CSc. dvorak@uai.fme.vutbr.cz. Speciální funkce QUOTE. (quote S - výraz )
E N D
JUI - 2. přednáškaZákladní funkce, definice funkcí RNDr. Jiří Dvořák, CSc. dvorak@uai.fme.vutbr.cz
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) • .
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)
CAR CDR CONS ATOM EQ zjišťování částí S-výrazů konstrukce S-výrazů predikátové funkce Primitivní funkce
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.
Funkce CONS • (cons forma1forma2) • 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.
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 forma1forma2) • 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.
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.
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.
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.
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í.
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).
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ů.
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.
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 &restr)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.
Rozšíření možností definice funkcí • Parametry označené klíčovými slovy • (defun jm-fce (p1 … &keyks1 …)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, … .