DVOP4 PIT
Bc. Matěj Cajthaml ©
Smíchovská střední průmyslová
škola a gymnázium
Existují modernější funkcionální jazyky, např.: Haskell, Erlang, F#
Funkce jsou ale všude — lze aplikovat i v jiných jazycích. Viz např. JavaScript, LINQ v C#, ...
#lang racketracket spustí překlad a interpretacidefine
Racket a další jazyky mají předpřipravené operátory. Např.: (+ 1 2) je ekvivalentní
zápisu
1 + 2 v jiných jazycích.
Vyhodnoďte následující výrazy:
(/ 1 2)(floor (/ 1 2))(+ 1 (* 2 3))(+ 1 (* 2 (- 3 4)))(+ (ceiling (/ 1 2)) (* 2 (3 (- 4 5))))#t#f(not x)(and x y)(or x y)(= x y)(< x y)(> x y)(<= x y)(>= x y)(+ x y)(- x y)(* x y)(/ x y)(floor x)(ceiling x)(print x)(newline)Vyhodnoďte následující výrazy:
(not #t)(and #t #f)(or (not #t) #f)(= 1 (+ 1 (* 2 3)))(< 1 (+ 1 (* 2 3)))(> 1 (+ 1 (* 2 3)))
(if test then else)#t, vyhodnotí se then#f, vyhodnotí se else
V racketu neexistuje jednoduchá iterace — většinu věcí řešíme pomocí rekurze a různých funkcí.
Napište následující funkce:
(inc x) — zvýší číslo o 1(dec x) — sníží číslo o 1(zero? x) — zjistí, zda je číslo 0(add x y) — sečte dvě čísla pomocí funkcí výše(mul x y) — vynásobí dvě čísla pomocí funkce
addNapište program, který vypočítá mocninu čísla x s exponentem n.
Napište program, který vypočítá n-tý prvek Fibonacciho posloupnosti.
(a . b)empty(1 2 3) je reprezentován jako (1 . (2 . (3 . empty)))(cons a b) — vytvoří buňku (a . b)(car x) — vrátí hlavu buňky(cdr x) — vrátí zbytek buňky(list a b c) — vytvoří list (a b c)(null? x) — zjistí, zda je list prázdný(equal? x y)#t, pokud jsou x a y stejné
(včetně
struktury)
#f
' či (quote x) — zamezí evaluaciNapište vlastní funkci length, která spočítá délku listu.
Napište funkci (nth n list), která vrátí n-tý prvek listu.
Napište funkce (min list) a (max list), které vrátí nejmenší a
největší prvek listu.
Napište funkci (contains? list x), která zjistí, zda list obsahuje prvek
x.
Napište funkci (range a b), která vytvoří list čísel od a do
b.
Napište funkci (reverse list), která prohodí prvky listu (první s posledním,
druhý s předposledním, atd.).
Napište funkci (remove list x), která odstraní všechny výskyty prvku
x z listu.
Napište program, který zjistí, zda zadané číslo je prvočíslo.
Prvočíslo je číslo, které je dělitelné pouze jedničkou a sebou samým.
Co když potřebujeme ve funkci několikrát použít stejný výraz?
(let (variables) body)(name value)
if(cond (test1 body1) (test2 body2) ...)else
Rekurze jsou pomalé. Proč?
Můžeme definovat funkci uvnitř funkce?
map, filter, fold(lambda (params) body)
Aplikuje funkci na každý prvek seznamu a vrátí seznam výsledků.
Vrátí seznam prvků, které splňují podmínku.
Prochází seznam a vrací jednu hodnotu. Foldr prochází seznam zprava doleva, foldl zleva doprava.
Co se stane, když ve funkci budeme po sobě volat více funkcí?
Vytvořte vlastní implementace funkcí map, filter a foldr. Nepoužívejte vestavěné funkce.
Vytvořte funkci, která vytvoří seznam prvočísel menších než zadané číslo pomocí Eratosthenova síta. Použijte funkcí filter.
Najděte různé aplikace, které používají Racket či Lisp. Co vás nejvíce zaujalo?
Najděte různé knihovny, které existují pro Racket. Jde v Racket vytvářet UI? Zapisovat soubory? Zkuste nějakou knihovnu použít.
Najděte si informace o Haskellu nebo jiném moderním funkcionálním jazyku. Jazyk si zkuste vyzkoušet a napište nějaký jednoduchý program.
Děkuji za pozornost!