16
JUI - 2. přednáška Základní funkce, definice funkcí RNDr. Jiří Dvořák, CSc. [email protected]

JUI - 2. přednáška Základní funkce, definice funkcí

  • Upload
    norton

  • View
    25

  • Download
    2

Embed Size (px)

DESCRIPTION

JUI - 2. přednáška Základní funkce, definice funkcí. RNDr. Jiří Dvořák, CSc. [email protected]. Speciální funkce QUOTE. (quote S - výraz ) - PowerPoint PPT Presentation

Citation preview

Page 1: JUI - 2. přednáška Základní funkce, definice funkcí

JUI - 2. přednáška

Základní funkce, definice funkcí

RNDr. Jiří Dvořák, [email protected]

Page 2: JUI - 2. přednáška Základní funkce, definice funkcí

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)

.

Page 3: JUI - 2. přednáška Základní funkce, definice funkcí

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)

Page 4: JUI - 2. přednáška Základní funkce, definice funkcí

4

Primitivní funkce

CAR

CDR

CONS

ATOM

EQ

zjišťování částí S-výrazů

konstrukce S-výrazů

predikátové funkce

Page 5: JUI - 2. přednáška Základní funkce, definice funkcí

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.

Page 6: JUI - 2. přednáška Základní funkce, definice funkcí

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.

Page 7: JUI - 2. přednáška Základní funkce, definice funkcí

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.

Page 8: JUI - 2. přednáška Základní funkce, definice funkcí

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.

Page 9: JUI - 2. přednáška Základní funkce, definice funkcí

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.

Page 10: JUI - 2. přednáška Základní funkce, definice funkcí

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.

Page 11: JUI - 2. přednáška Základní funkce, definice funkcí

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í.

Page 12: JUI - 2. přednáška Základní funkce, definice funkcí

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).

Page 13: JUI - 2. přednáška Základní funkce, definice funkcí

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ů.

Page 14: JUI - 2. přednáška Základní funkce, definice funkcí

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.

Page 15: JUI - 2. přednáška Základní funkce, definice funkcí

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.

Page 16: JUI - 2. přednáška Základní funkce, definice funkcí

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, … .