Vaje#
Naloga 1#
Napišite prestreznik
mute
, ki prestreže vgrajeniPrint
in prepreči izpis. Program naj nadaljuje nemoteno.Napišite prestreznik
shift_text_right n
, ki vse izpisano besedilo zamakne v desno zan
mest.Prestreznik
underline
vsako izpisano vrstico podčrta (tako da v novi vrstici izpiše primerno število znakov-
).Prestreznik
custom_separator sep
naj poskrbi, da se ločeno izpisani tekst ne loči z\n
temveč separatorjemsep
.
Naloga 2#
Želimo narediti prestreznik za memoizacijo. Že izračunane vrednosti bomo (neučinkovito) hranili v seznamu parov.
Napišite funkciji za delo s seznami parov
find : 'a -> ('a * 'b) list -> 'b option
insave : 'a -> 'b -> ('a * 'b) list -> ('a * 'b) list
.Da si poenostavimo življenje, se osredotočimo zgolj na funkcije
int -> int
. V nadaljevanju uporabljamo preimenovanjitype arg = int
intype result = int
. Naša memoizacija bo potrebovala pomnilnik, zato bomo zanj definirali poseben prestreznik. Definirajte učinkaLookup : arg -> result option
inRemember : arg * result -> unit
. Nato zanju napišite prestreznikmemory
, ki upravlja s pomnilnikom tipa(arg * result) list
.Sedaj lahko funkcije že uporabljajo pomnilnik za memoizacijo, vendar bi želeli, da je memoizacija funkcije zgolj eno od možnih izvajanj. Zato definirajte učinek
Evaluate : ((int -> int) * int) -> int
, ki sprejme funkcijo in argument, ter nam vrne rezultat. Funkcij sedaj ne kličemo več kotf x
temveč kotperform (Evaluate (f, x))
(priporočam, da si ustvarite pomožno funkcijoeval f x = ...
za lepšo sintakso). Napišite prestreznikno_memo
, ki funkcijo izvede, kot bi se izvedla sicer. Nato napišite še prestreznikmemo
, ki funkcijo memoizira.
Namig: Če želite rekurzivne prestreznike, jih definirajte kot let rec h () = handler ...
kjer jih lahko sedaj v telesu definicije uporabite z with h () handle ...
.
Naloga 3#
Generatorji so funkcije, ki zaporedoma uporabljajo učinek Yield : int -> unit
.
Napišite funkcijo, ki generira vsa naravna števila.
Napišite funkcijo
collect n gen
, ki iz generatorjagen
pobere prvihn
vrednosti.Napišite prestreznik
generator gen
, ki na zahtevoGenerate : unit -> int
generira novo vrednost iz generatorjagen
.
Namig: Eden od možnih načinov je, da z dodatnim prestreznikom generatorje iz tipa unit -> unit!{Yield}
pretvorite v tip unit -> gen
. Tu je gen
novo definiran tip, ki označuje, da je generator bodisi končal, bodisi pa je proizvedel element in svoje posodobljeno stanje (ponovno tipa unit -> gen
). Če potrebujete, ima Eff vgrajeno funkcijo failwith msg
.