Přehled předdefinovaných forem ve vykládaném dialektu LISPu

Transkript

Přehled předdefinovaných forem ve vykládaném dialektu LISPu
Předdefinované formy jazyka Scheme
verze 1 z 24.11.2002
Rudolf KRYL
Součástí přednášek z neprocedurálního programování je i krátké extempore o
programování v jazyce LISP. Používáme k tomu dialektu LISP, který se jmenuje Scheme.
Výklad na přednáškách vychází z knihy H.Abelsona a G.J.Sussmana Structure and
Interpretation of Computer Programs (přesná citace je v seznamu literatury k příslušným
předmětům), která byla na MIT používána v základním kursu programování.
V tomto materiálu se popisují jen ty předdefinované formy jazyka Scheme, které
budeme na přednášce a na seminářích potřebovat. Z jazyka Scheme jsme vynechali lokální
formu define a nahradili apostrof obvyklejší formou quote.
Tento text je pouze o něco rozšířeným přehledem standardních forem a nepokouší se
být ucelenou učebnicí.
1. Forma define
Pomocí formy define můžeme pojmenovat funkce resp. hodnoty (ty můžeme
považovat za nulární funkce).
Obecný tvar je
( define ( <jméno> <formální parametry> ) < tělo> )
Příklady použití :
(
(
(
(
define
define
define
define
dve 2 )
( plus4 x ) ( + x 4 ) )
( natreti x ) ( * x x x ) )
( sectikrychle x y ) ( + ( natreti x ) ( natreti y ) ) )
2. Podmíněn výraz - forma cond
Pomocí formy cond můžeme vytvářet podmíněné výrazy.
Pokud máme nějaký výraz interpretovat jako predikát (nabývající hodnot
pravda/nepravda), pak
·
·
(konstatní) výraz nil je interpretován jako nepravda
každý jiný výraz jako pravda
(nil tedy hraje obdobnou roli jako 0 v jazyku C).
Obecný tvar výrazu definovaného pomocí formy cond má je
( cond ( <p1> <e1> )
( <p2> <e2> )
...
( <pn> <en> ) )
a
kde pro i=1..n jsou pi výrazy, které interpretujeme jako predikáty a vi výrazy. Postupně
vyhodnocuje predikáty p1, p2, … až do doby, kdy první z nich – dejme tomu pj - je pravdivý.
Hodnotu výrazu pak určuje příslušný výraz ej . Pokud žádný z predikátů není pravdivý, je
hodnotou definovaného výrazu nil .
Příklady použití :
(define ( abs x )
( cond ( ( > x 0 ) x )
( ( = x 0 ) 0 )
( ( < x 0 ) ( - x ) )
) )
3. Podmíněn výraz - forma if
Forma if je funkcionální obdobou podmíněného příkazu. Obecný tvar je :
( if <podmínka> <důsledek> <alternativa> )
Vyhodnotí se výraz <podmínka> a interpretuje se jako predikát, pokud je pravdivý,
určuje hodnotu výraz <důsledek>. Pokud je výraz <podmínka> nepravdivý, určuje hodnotu
výrazu výraz <alternativa> .
Příklady použití :
(define ( abs x )
( if ( < x 0 ) (- x)
x ) )
4. Forma lambda
Jedním ze zdrojů LISPu byl tzv. λ-kalkul . Odtud název formy, která umožňuje vyhnout
se nutnosti pojmenovávat každou funkci, se kterou chceme pracovat. Lambda forma vyrábí
z funkce „její jméno“. Oceníme to především chceme-li rozlišovat mezi parametry a
proměnnými funkcí.
Obecný tvar je
( lambda ( < formální parametry > < tělo > ) .
Příklady použití :
( lambda ( x ) ( + x 5 ) )
( lambda ( x y ) ( + x y ) )
( lambda ( x ) ( + x y ) )
„funkce plus 5“ jedné proměnné
„funkce plus “ dvou proměnných
„funkce plus y“ jedné proměnné,
která přičítá k proměnné hodnotu parametru y
hodnoty následujících výrazů
( ( lambda ( x ) ( + x 5 ) ) ( 13 )
( lambda ( x y ) ( + x y ) ) ( 5 12 )
( lambda ( x ) ( + x y ) ) ( 4 )
Následující dva výrazy jsou ekvivalentní :
( define ( plus4 x ) ( + x 4 ) )
( define plus4 ( lambda (x ) ( + x 4 ) ) )
„=“ 18
„=“ 17
„=“ y .
5. Forma let
Forma let umožňuje mimo jiné lokální označení nějaké hodnoty. Význam má především
pro efektivitu programů. Obecný tvar vypadá následovně :
( let ( ( <var1> <exp1> )
( <var2> <exp2> )
……
( <varn> <expn> ) )
< tělo > )
kde vari jsou proměnné a expi výrazy. Význam formy spočívá v tom, že ve výrazu tělo
označuje každá z proměnných vari hodnotu výrazu expi ..
Ekvivalentně lze tedy předcházející definici zapsat jako
(
(lambda ( (
<var1> <var2>
< tělo > )
<exp1> <exp2> … <expn> )
…
<varn>
)
Vidíme tedy, že bychom se bez formy let obešli. Je třeba si uvědomit, že „substituce“
definované v příkazu let platí až ve výrazu < tělo >, ne ve výrazech <expi> .
Příklady použití :
( define ( f x
let (
(
(
( + (
(
(
y
a
b
*
*
*
)
(
(
x
y
a
+
(
b
b
1 ( * x y ) ) )
1 y ) )
)
square a ) )
)
)
) ) )
6. Dvojice
Dvojice jsou zadány pomocí dvou selektorů car a cdr ;a konstruktoru cons .
Pokud definujeme
( define x ( cons 5 3 ) )
pak výraz
( car x )
( cdr x )
má hodnotu
má hodnotu
5
3
Téměř všechny dialekty mají definovány funkce jako caddr, cdar, cddadr následujícím
způsobem :
( define ( caddr x ) ( car ( cdr ( cdr x ) ) ) )
( define ( cdar x ) ( cdr ( car) )
)
( define ( cddadr x ) ( cdr ( cdr ( car ( cdr x ) ) ) ) )
7. Seznamy
Obdobně jako v Prologu jsou i v Lispu seznamy definovány rekursivně pomocí dvojic.
Prázdný seznam je reprezentován konstantou nil ,
neprázdný seznam je dvojice hlava (první prvek) a ocas (seznam zbylých prvků).
Seznam obsahující prvky 1, 2 , 3 a 4 je tedy reprezentován výrazem
( cons 1 ( cons 2 ( cons 3 ( cons 4 nil ) ) ) )
Existuje však i forma list, která z výčtu prvků vyrábí příslušný seznam. V našem případě
( list 1 2 3 4 )
dá stejný výsledek
Příklady použití :
( cadr ( list 1 2 3 4 5 ) )
( cdddr ( list 4 5 6 7 8 ) )
má hodnotu
má hodnotu
2
( list 7 8 )
8. Forma quote
V dětství jste se možná setkali s tím, že se na Vás někdo obrálil slovy: „Řekni jak se
jmenuješ“ . Pravděpodobně jste mu to prozradili – např. „Pepík Vomáčka“. Byl-li ošklivý
(nebo matfyzák – nebo dokonce obojí zároveň), pokáral Vás, že neumíte ani opakovat
jednoduchou větu. Prý chtěl, abyste opakovali větu , kterou řekl. Očekával, že odpovíte „Jak
se jmenuješ“ . Pokud byste odpověděli takto, pokáral by Vás také, že chtěl vědět, jak se
jmenujete. To je samozřejmě lapálie.
V logice (kde sebereflexe je velmi důležitým postupem) je pochopitelně potřeba
rozlišovat mezi těmito dvěma možnostmi. Jinak bychom se mohli dopouštět vážných chyb
v důkazech.
Forma quote vrací „výraz sám“ aniž by došlo k jeho vyčíslení.
Příklady použití :
na
na
na
na
na
na
(
(
(
(
(
(
define a 1 )
define b 2 )
list a b )
list ( quote a ) b )
list ( quote a ) ( quote b ) )
car ( quote ( a b c ) )
odpoví interpret
odpoví interpret
odpoví interpret
odpoví interpret
odpoví interpret
odpoví interpret
a
b
( 1 2 )
( a 2 )
( a b )
a

Podobné dokumenty

prezentaci

prezentaci 1. Na začátku programu musı́ být direktiva #include 2. printf("Ahoj"); 3. printf("Ahoj\n"); 4. printf("Vysledek je %d\n", a); 5. printf("Vysledek je %d\n", a/b); 6. printf("Hodnoty jso...

Více

slajdy

slajdy prvky množin A = {a1 , a2 , . . . , an } jsou z univerza U na U je definováno lineární uspořádání ≤ reprezentace množiny: uspořádaný (setříděný) seznam hodnot Výhody a nevýhody nové reprezentace: v...

Více

Ceny na víkend

Ceny na víkend 3. Minimální doba pronájmu je 24 hodin, tolerance 59 minut 4. Spoluúčast u pojištění je 10%, min. 10000 CZK 5. Víkend.sazba: převzetí nejdříve v pátek ve 12:00, vrácení nejpozději v pondělí v 9:00 ...

Více

Jméno Rupert Barque EXP2/VAL1 Role Liga není Zkušenosti Rasa

Jméno Rupert Barque EXP2/VAL1 Role Liga není Zkušenosti Rasa nebo potřebuješ-li informace o nějakém lénu máš možnost hodem ověřit odpovídající znalost, i když tyto znalosti nemusí postava mít prohloubené (tj. nemá je mezi trénovanými). Povolené je jenom jedn...

Více

PT USA Flydrive fully + EP and GPS

PT USA Flydrive fully + EP and GPS Pro všechny výpůjčky (Kromě Floridy) od 3.7. 2016 - do 20.8. 2016 . Pro Floridu platí od 17.12 do 31.12.2016 Příplatky ve výše zmíněných obdobích: příplatek 2 100 Kč na týden nebo 430 Kč na den u v...

Více

Úvod - Robotika.cz

Úvod - Robotika.cz Náročnější druhy algoritmů, pravděpodobnostní algoritmy pro zpracování senzorů, pro plánování, práce s neúplnou informací (cca 6 přednášek) Cvičení Celkem asi 6, nejspíše po přednášce, v laboratoři...

Více

Univerzita Karlova je prestižní, kosmopolitní a

Univerzita Karlova je prestižní, kosmopolitní a V současné době má UK uzavřeno přes 1 500 bilaterálních smluv v rámci programu LLP/Erasmus plus a 193 meziuniverzitních smluv se zahraničními univerzitami. Partnery UK jsou zejména prestižní vysoké...

Více

IDS/IPS - ano či ne?

IDS/IPS - ano či ne? Adr. škod.o kódu na kterou se odskočí ve chvíli kdy fce skončí

Více