Symbolický výraz
- Jde o jednoduchý výraz (atom) nebo složený výraz (seznam)
Jednoduchý výraz (atom)
- Jde o číslo (10, -5, 4.9999D0) nebo symbol (posloupnost písmen/čísel/znaků) nebo literál
Složený výraz (seznam)
- Posloupnost jednoho nebo více výrazů (prvky složeného výrazu), které jsou odděleny mezerami
(+ 1 2), (+). (1 2 3)
Terminologie složeného výrazu
Operátor … co se má udělat Operandy … s čím se to má udělat
- Lisp důsledně používá prefixovou notaci
Vyhodnocení symbolických výrazů v Lispu
- Když symbolický výraz napíšeme do Listeneru a dostaname výsledek tak mu říkáme hodnota symbolického výrazu
- je hodnotou symbolického výrazu `(/ (- 5 3) (+ 5 3))
- Přesně popsanému procesu, který vede v této hodnotě říkáme vyhodnocovací proces
Vyhodnocovací proces
Vyhodnocení výrazu
- Je-li symbol, výsledkem je hodnota symbolu
- Je-li jiný atom než symbol, výsledkem je
- Je-li seznam s operátorem a operandy , pak
- jestliže je speciální operátor, vyhodnotí se podle jeho pravidel
- jestliže je název makra, se expanduje podle pravidel makra a výsledný výraz se vyhodnotí v prostředí
- jinak musí být symbol → se zjistí hodnota funkční vazby symbolu v prostředí
- zjistí se hodnoty argumentů v prostředí (opět vyhodnocovací proces)
- výsledkem je výsledek aplikace funkce na hodnoty (aplikace může mít vedlejší efekt)
- Symbol může sloužit jako jméno pro hodnotu (např.
pi
pro ) a říkáme mu proměnná- Říkáme, že symbol je na hodnotu navázán
- Hodnota se vždy hledá v aktuálním prostředí, při neúspěchu se postupuje o úrovně výš
Funkce v Lispu
- Ucelená část programu obsahující výpočet
- Hodnoty použité při aplikaci funkce jsou argumenty
- Aplikace funkce = spuštění kódu
- Používáme jako abstrakci (vyšší srozumitelnost, snadnější změny, snížení chybovosti, …)
- Funkce si pamatuje prostředí svého vzniku a tím pádem ji můžeme nazvat lexikální uzávěr (kromě toho i seznam parametrů a tělo)
- Funkce bez názvu … anonymní funkce (operátor
lambda
)
lambda výraz ( -výraz)
Predikát
- Funkce, která jako výsledek vrací jednu z pravdivostních hodnot (
t
nebonil
)
Speciální operátory
- Operátor pro který neplatí standardní (zjednodušený) vyhodnocovací proces a mají svůj vlastní
- Např.
if
,setf
Prostředí a vazby
- Symbol může mít více vazeb (jedna je vždy aktuální)
- Máme 2 typy vazeb
- hodnotová
- funkční
- Každá vazba má hodnotu (hodnota symbolu = hodnota aktuální vazby)
- Vazby jsou organizovány v prostředí (znázornění pomocí tabulky)
Operátor
let
- Slouží k explicitnímu vytvoření nového prostředí.
- Operátor
labels
vytváří prostředí s funkčními vazbami symbolů
Datová struktura
Zajišťuje nám datovou abstrakci. Pracujeme s ní pomocí: konsturktorů, selektorů, mutátorů. Mutátory nejsou přípustné ve funkcionálním programování.
Vedlejší efekt
Může nastat při vyhodnocení výrazu, pokud kromě vrácení hodnoty výrazu je způsobena ještě nějaká vnější změna.
interní vedlejší efekt … např. mutace hodnoty v datové struktuře externí vedlejší efekt … není možné zpětně programem zjistit (např. tiskový výstup)
- literál … textový řetězec zadaný přímo ve zdrojovém kódu