#lang racket ;; mutirani pari/seznami ;; - testiranje tipa: (mpair? v) ;; - ustvarjanje: (mcons a d) ;; - dereferenciranje: (mcar p) (mcdr p) ;; - prirejanje (set-mcar! p v) (set-mcdr! p v) ;; ZAKASNITEV/SPROŽITEV s predavanj ;; (zakasni thunk) `thunk` mora biti funkcija brez argumentov (define (zakasni thunk) (mcons #f thunk)) ;; (sproži prom) `prom` mora biti mutiran par, ;; ki je rezultat klica funcije `zakasni`. (define (sproži prom) (if (mcar prom) (mcdr prom) (begin (set-mcar! prom #t) (set-mcdr! prom ((mcdr prom))) (mcdr prom)))) ;; Naša implementacija zakasnitev/sprožitev. (define a (zakasni (λ () (/ 1 2 3 4)))) ; a (sproži a) a (sproži a) ;; Racket-ova implementacija zakasnitev/sprožitev. (define b (delay (λ () 101))) ; b (force b) b (define c (delay 123)) ; c (force c) c ;; Še nekaj primerov z zakasnitvami. ;; počasno seštevanje (define (počasno+ a b) (begin (sleep b) (+ a b))) (define dta (delay (počasno+ 1000 2))) (define (ta) (počasno+ 1000 2)) ;(force dta) ;(ta) ;(force dta) ;; THUNKING ;; (λ () a) (thunk a) ;; TOKOVI ;; Kakšna je razlika med `enkef` in `enke`? (define (enke2) (cons 11 enke2)) (define enke (cons 11 (λ () enke))) (define enke* (cons 11 (thunk enke*))) ;; CIKLIČNI TOK ;; Implementiranj tok `tok123`, ki ga ;; definira zaporedje 1 2 3 1 2 3 1 ... ; (define tok123 (let loop ([i 1]) (cons i (thunk (loop (if (= i 3) 1 (add1 i))))))) ;; Implementiranj funkcijo `ponavljaj`, ki ;; prejme seznam iz iz njega naredi tok. ;; Primer: ;; (ponavljaj (list 1 2)): 1 2 1 2 1 2... ; (define (ponavljaj s) (let loop ([sez s]) (match sez [(cons h t) (cons h (thunk (loop t)))] ['() (loop s)]))) ;; PRETVORBA V SEZNAM ;; Implementiranj funkcijo `vzemi`, ki iz prvih ;; `n` elementov toka zgradi seznam. ;; Primer: ;; (vzemi 4 tok123): '(1 2 3 1) ; (define (vzemi n tok) (match tok [(cons h t) #:when (> n 0) (cons h (vzemi (sub1 n) (t)))] [_ '()])) ;; ZLIVANJE TOKOV ;; Implementiranj funkcijo `zadrga`, ;; ki zlije dva tokova v nov tok. ;; Primer: ;; s1: 1 2 3 ... ;; s2: a b c ... ;; (zadrga s1 s2): 1 a 2 b 3 c ... ; ; SML OPCIJE S SML SINTAKSO V RACKET-U (struct some (a) #:transparent) (struct none () #:transparent) (define-syntax sml (syntax-rules (valOf isSome SOME NONE) [(sml NONE) (none)] [(sml SOME a) (some a)] [(sml valOf a) (some-a a)] [(sml isSome a) (some? a)]))