140 likes | 216 Views
JUI - 3. přednáška Zpracování seznamů, predikátové a vyhodnocovací funkce. RNDr. Jiří Dvořák, CSc. dvorak@uai.fme.vutbr.cz. Funkce pro zpracování seznamů. append spojování seznamů list konstrukce seznamů last zjištění posledního prvku seznamu length délka seznamu
E N D
JUI - 3. přednáškaZpracování seznamů, predikátové a vyhodnocovací funkce RNDr. Jiří Dvořák, CSc. dvorak@uai.fme.vutbr.cz
Funkce pro zpracování seznamů • append spojování seznamů • list konstrukce seznamů • last zjištění posledního prvku seznamu • length délka seznamu • reverse otočení seznamu
Funkce append a list • append • Funkce append může mít proměnný počet argumentů. Hodnotami argumentů musejí být seznamy a výsledkem je seznam vzniklý spojením těchto seznamů. Při provedení funkce append se tolikrát provede primitivní konstruktor cons, kolik činí součet délek seznamů ve všech argumentech kromě posledního. • list • Funkce list může mít rovněž proměnný počet argumentů, ale jejich hodnotami mohou být libovolné S-výrazy. Výsledkem je seznam vzniklý spojením těchto S-výrazů. Za jedním provedením funkce listje schováno tolik aplikací primitivního konstruktoru cons, kolik má list argumentů.
Funkce last, length a reverse • last • Funkce last má jeden argument, jehož hodnotou musí být seznam. Výsledkem je seznam obsahující pouze poslední prvek seznamu v argumentu. • length • Funkce length má jeden argument, jehož hodnotou musí být seznam. Výsledkem je počet prvků na nejvyšší úrovni seznamu v argumentu. • reverse • Funkce reverse má jeden argument, jehož hodnotou musí být seznam. Výsledkem je obrácený seznam, přičemž obracení se týká pouze nejvyšší úrovně seznamu a nižší vrstvy zůstávají nedotčeny.
Predikátové funkce • equal test na shodu S-výrazů • null test na prázdný seznam • member test na členství v seznamu • listp • numberp typové predikáty • symbolp • boundp test na vazbu proměnné • zerop test na nulu • plusp test na kladnou hodnotu • minusp test na zápornou hodnotu • and, or, not logické operace
Predikáty equal, null a member • equal • Funkce equal má dva argumenty, jejichž hodnotami mohou být libovolné S-výrazy. Pokud jsou shodné, výsledkem je T, v opačném případě je výsledkem nil. • null • Funkce null má jeden argument, jehož hodnotou by měl být seznam. Pokud je tento seznam prázdný, výsledkem je T, v opačném případě je výsledkem nil. • member • Funkce member má dva argumenty. Hodnotou prvého je libovolný S- výraz a a hodnotou druhého musí být seznam. Funkce testuje existenci S-výrazu na nejvyšší úrovni seznamu. V případě úspěchu vracíne hodnotu T, ale přímo tu část seznamu, kde tento S-výraz nalezla. Při neúspěchu vrací samozřejmě nil.
Typové predikáty a boundp • listp • Funkce listp má jeden argument. Tato funkce testuje, zda hodnotou argumentu je seznam. • numberp • Funkce numberp má jeden argument a testuje, zda hodnotou tohoto argumentu je číslo. • symbolp • Funkce symbolp má jeden argument a testuje, zda jeho hodnotou je symbol. • boundp • Funkce boundp má jeden argument, jehož hodnotou by měl být symbolický atom. Pokud je na tento atom navázána hodnota, funkce vrací T, jinak vrací nil.
Predikáty pro porovnávání s nulou • zerop • Funkce zerop má jeden argument, jehož hodnotou by mělo být číslo. Tato funkce testuje, zda hodnota argumentu je rovna nule. • plusp • Funkce plusp má jeden argument, jehož hodnotou by mělo být číslo. Tato funkce testuje, zda hodnota argumentu je kladná. • minusp • Funkce minusp má jeden argument, jehož hodnotou by mělo být číslo. Tato funkce testuje, zda hodnota argumentu je záporná.
Predikát not • Tato funkce je pouze synonymem pro predikát null. Je však doporučeno ji používat jako zdůraznění, že se nejedná o testování konce seznamu, ale o logickou negaci (v lispovském pojetí). • Platí • (not nil) => T • (not x) => nil pro xnil
Predikáty and a or • Predikáty and a or jsou speciální funkce zajišťující výpočet logického součinu a logického součtu svých argumentů v lispovské interpretaci. • and • Vyhodnocuje své argumenty tak dlouho, až narazí na prvý s hodnotou ni1 a pak vrátí nil. Jinak vyhodnotí všechny argumenty a vrací hodnotu posledního. • or • Vyhodnocuje své argumenty tak dlouho, až narazí na prvý s hodnotou různou od ni1 a jeho hodnotu pak vrátí jako výsledek. Jinak vyhodnotí všechny argumenty a vrátí nil. • Z popisu je vidět, že tyto speciální funkce vyhodnotí vždy jen tolik argumentů, kolik je zapotřebí k určení výsledku.
Vyhodnocovací funkce • eval základ vyhodnocovacího systému • apply aplikace funkcí • funcall aplikace funkcí
Funkce eval • Funkce eval je základem vyhodnocovacího systému. Je to funkce jediného argumentu a pokud ji použijeme v explicitním volání, dojde vlastně ke dvojímu vyhodnocení tohoto argumentu: poprvé se vyhodnotí jako argument kterékoliv jiné funkce, získaná hodnota se pak předá funkci eval a ta jej vyhodnotí znovu! • Hodnota argumentu funkce eval musí mít jeden z těchto tvarů: • číselný atom – eval vrátí totéž číslo • symbolický atom – eval vrátí hodnotu vázanou na toto jméno • seznam tvaru (f al a2... an),kde f je jméno funkce a každé ajlze opět vyhodnotit • Prostřednictvím funkce eval dostáváme velmi mocný prostředek: můžeme dynamicky vytvořit určitou část programu a takto vytvořenou část bezprostředně jako program vyhodnotit.
Funkce apply • Při vyhodnocení zápisu funkce v Lispu se standardně vyhodnotí její argumenty, z jejích hodnot se udělá seznam a ten se předá k aplikaci. Ta část vyhodnocovacího systému, která aplikaci funkce provádí, je v Lispu k dispozici prostřednictvím funkce apply. • Funkce apply má dva argumenty. Hodnotou prvého argumentu musí být jméno funkce a hodnotou druhého musí být seznam hodnot jejích argumentů. • Platí vztah • (apply’fce’(val1val2 … valn)) = (fcearg1arg2 … argn) • kde vali je hodnota argumentu argi.
Funkce funcall • (funcall farg arg1 … argN) • Tímto zápisem se zajistí aplikace funkce, která je hodnotou výrazu farg, na hodnoty argumentů vypočtené jako hodnoty výrazů arg1, … , argN.