Please enable JavaScript.
Coggle requires JavaScript to display documents.
PARADIGMATA PROGRAMOVÁNÍ 1 (image (image (Let - Nejméně 2 výrazy. Seznam…
PARADIGMATA PROGRAMOVÁNÍ 1
SYMBOLICKÝ VÝRAZ
Je buď ATOM nebo SEZNAM (je buď jednoduchý nebo složený)
(
SEZNAM
)
je složený symbolický výraz, který
se skládá z atomů
nebo
1 a více SEZNAMŮ
.
ATOM
je buď
ČÍSLO
nebo
SYMBOL
OPERÁTOR
ARITMETICKÝ
SPECIÁLNÍ
if
Má přesně 3 argumenty
(
if
a b c), tedy (
if
(podminka) (true) (false))
define
Má přesně 2 argumenty
(
define
a b), tedy (
define
symbol_nazev_promenne hodnota_symbolu)
Slouží pro tvorbu (definici) vazeb symbol-hodnota (proměnných)
Má 3 argumenty, pro definici procedur
název+seznam parametrů+tělo
Vyhodnotí se
b
a hodnota
se naváže
do globálního prostředí
na symbol a
vytváří vazbu v globálním prostředí
let
Speciální operátor, který slouží pro explicitní tvorbu nového prostředí
cond
Postupně se vyhodnocují podmínky větví. Splní se tělo větve s první platnou podmínkou a hodnota vyhodnocení těla se vrátí jako výsledek. Další podmínky se už nevyhodnocují, něco jako else if v C.
Pokud není splněna žádná podmínka, dojde k chybě.
and
(and e1 e2 ... en)
Vrací #true, pokud všechny
ei
jsou #true, jinak vrací #false, pokud narazí na první
ei
, které je vyhodnocené na #false - líné vyhodnocování
or
(or e1 e2 ... en)
Vrací #true, pokud narazí na první
ei
vyhodnocené na #true. Jinak vrací #false.
not
- logická negace
Hodnotou operátoru (symbolu) JE PROCEDURA
PROMĚNNÁ
Symbol, který má
VAZBU
na hodnotu, je to název proměnné/hodnoty
Hodnotou může být i procedura -> operátor
nebo
TEXTOVÝ ŘETĚZEC
1. Prvek je vždy OPERÁTOR
- ATOM
VYHODNOCOVACÍ PROCES
PROČ?
Hodnotou symbolů + * / - jsou procedury!
Dělení a rozdíl potřebují alespoň 1 argument
Protože tyto procedury mají defaultně nastavené NEUTRÁLNÍ "nic neměnící" argumenty. Násobení má *1, součet +0, dělení a rozdíl potřebují jeden argument, protože 1/argument, 0-argument, neutrální hodnoty pro tyto procedury - matematické operace neexistují.
OPERÁTORY + * / - jsou vlastně procedury
Define nemůže být procedura, ale musí být speciální operátor, protože procedury před aplikací vyhodnotí výrazy - parametry - na jejich hodnoty - argumenty - a potom se procedura aplikuje s těmito argumenty. V případě, že by define byl procedura, potom by došlo k chybě při vyhodnocování symbolu bez vazby na hodnotu, tedy u prvního parametru, kde define dostává symbol jako název proměnné, kterému přiřadí hodnotu, získanou vyhodnocením výrazu ve druhém parametru.
Rozdíl je ve vyhodnocovacím procesu. Procedura před aplikací nejprve vyhodnotí výrazy - parametry na jejich hodnoty - argumenty a potom se aplikuje s těmito argumenty. Speciální operátor pracuje i se symboly bez vazeb na hodnoty a každý speciální operátor provádí vyhodnocení parametrů podle vlastních speciálních pravidel. K vyhodnocení některých parametrů nemusí ani dojít (např. jedna z větví if, podle hodnoty vyhodnoceného podmínkového výrazu.)
Define
-
2
symb. výrazy pro definici proměnné - symbol jako název proměnné a hodnota (případně seznam, který lze na hodnotu vyhodnotit).
3
pro definici procedury - název, parametry, tělo, to vše je však seskupeno ve dvou seznamech (define (nazev_proc param1 param2 ...) (telo_proc))
Let
- Nejméně 2 výrazy. Seznam popisující prostředí, které vytváříme a tělo. Prvky seznamu jsou popisy vazeb (také seznamy, kde 1. prvek je symbol a druhý jeho hodnota nebo seznam, který lze na hodnotu vyhodnotit). V těle pak pracujeme s proměnnými, které jsem si v novém prostředí vytvořili.
přesně 3? Symbol LET, popis prostředí a tělo?
REKURZE
REKURZIVNÍ PROCEDURA
Ve svém těle aplikuje sebe sama. Poznáme ji ze zdrojového kódu.
REKURZIVNÍ
VÝPOČETNÍ PROCES je takový proces, kdy
během aplikace procedury
dojde opět k její aplikaci.
To je v podstatě situace, kdy třeba pro dokončení aplikace procedury - vyhodnocení nějakého výrazu nejsem schopný zjistit jeho hodnotu, kterou zjistím právě opětovnou aplikací téže procedury. Tudíž se mi kumulují "úkoly" (výrazy) k vyhodnocení, kterým vždy chybí hodnota jednoho z parametrů. Postupně se prokoušu až na konec, kde zjistím hodnotu argumentu a zpětně se pak vracím a dopočítávám úkoly. Viz.
Pascal triangle
.
Měly by existovat
ukončovací podmínka
zabraňující opětovnému volání procedury - říká "tady jsme v cíli".
ITERATIVNÍ
VÝPOČETNÍ PROCES
SPECIÁLNÍ PŘÍPAD
když na konci těla procedury dojde k opětovné aplikaci téže procedury.
Např.
Faktoriál
- už existuje výsledek určitého kroku (mezivýsledek
ir
a.k.a.
intermediate result
, ale pro dokončení kompletního výpočtu faktoriálu se proces výpočtu opakuje a opakuje.
PREDIKÁTY
eq?, =, < atd. je predikát (předpoklad), obvykle implikace, kterou je vlastně podmínka if - jestliže, pak...
integer?
vrací
#true
, pokud je argument celé číslo, jinak
#false
Zajímavé použítí predikátlů a ifu
IDENTITY
PROCEDURA
Pamatuje si své
PARAMETRY
,
TĚLO
a
PROSTŘEDÍ
, kde vznikla
APLIKACE
procedury
Vyhodnotí se
parametry procedury na argumenty, vždy a všechny podle pravidel vyhodnocovacího procesu
Procedura se aplikuje
s těmito/na tyto argumenty
Vznikne nové prostředí - prostředí této procedury a jeho předkem se učiní globální prostředí
V tomto prostředí se argumenty naváží na parametry z definice - symboly
Provede se aplikace - vyhodnocení těla procedury v jejím prostředí a výsledkem vyhodnocení je nějaká hodnota
REKURZIVNÍ
má vždy 2 části - ukončovací podmínku a volání sebe sama
PROSTŘEDÍ VZNIKU
je prostředí, kde je procedura definováná, NIKOLIV odkud je aplikována!