Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #lang racket
- (struct int (n) #:transparent)
- (struct true () #:transparent)
- (struct false () #:transparent)
- (struct complex (a b) #:transparent)
- (struct empty () #:transparent)
- (struct :: (e1 e2) #:transparent)
- (struct if-then-else (condition e1 e2) #:transparent)
- (struct is-int (e1) #:transparent)
- (struct is-bool (e1) #:transparent)
- (struct is-complex (e1) #:transparent)
- (struct is-list (e1) #:transparent)
- (struct add (e1 e2) #:transparent)
- (struct mul (e1 e2) #:transparent)
- (struct gt (e1 e2) #:transparent)
- (struct both (e1 e2) #:transparent)
- (struct any (e1 e2) #:transparent)
- (struct ! (e1) #:transparent)
- (struct hd (x) #:transparent)
- (struct tl (x) #:transparent)
- (struct is-empty (x) #:transparent)
- (struct @ (a b) #:transparent)
- (struct real (e1) #:transparent)
- (struct imaginary (e1) #:transparent)
- (struct var (s e1 e2) #:transparent)
- (struct valof (s) #:transparent)
- (struct fun (name fargs body) #:transparent)
- (struct proc (name body) #:transparent)
- (struct envelope (env f) #:transparent)
- (struct call (e args) #:transparent)
- ;
- (define (mi e okolje)
- (letrec ([mi2 (lambda (e okolje)
- (cond
- #|Podatkovni tipi |#
- [(int? e) e]
- [(true? e) e]
- [(false? e) e]
- [(complex? e) (let
- ([v1 (mi2 (complex-a e) okolje)]
- [v2 (mi2 (complex-b e) okolje)])
- (complex v1 v2))]
- [(::? e) (let
- ([v1 (mi2(::-e1 e) okolje)]
- [v2 (mi2(::-e2 e) okolje)])
- (:: v1 v2)
- )]
- [(empty? e) e]
- #|Nadzor toka|#
- [(if-then-else? e) (let ([c (mi2(if-then-else-condition e) okolje)]
- [e1 (if-then-else-e1 e)]
- [e2 (if-then-else-e2 e)])
- (if(true? c) (mi2 e1 okolje) (mi2 e2 okolje)))]
- [(is-int? e) (if(int? (mi2 (is-int-e1 e) okolje)) (true) (false))]
- [(is-bool? e) (cond [(true? (mi2 (is-bool-e1 e) okolje)) (true)]
- [(false? (mi2 (is-bool-e1 e) okolje)) (true)]
- [else (false)])]
- [(is-complex? e) (if(complex? (mi2 (is-complex-e1 e) okolje)) (true) (false))]
- [(is-list? e) (cond [(empty? (mi2 (is-list-e1 e) okolje)) (true)]
- [(::? (mi2 (is-list-e1 e) okolje)) (true)]
- [else (false)])]
- [(add? e) (cond
- [(and (int? (mi2 (add-e1 e) okolje )) (int? (mi2 (add-e1 e) okolje)) ) (int (+ (int-n (mi2 (add-e1 e) okolje)) (int-n (mi2 (add-e2 e) okolje))))]
- [(and (complex? (mi2 (add-e1 e) okolje)) (complex? (mi2 (add-e1 e) okolje))) (complex (int (+ (int-n (complex-a (mi2 (add-e1 e) okolje))) (int-n (complex-a (mi2 (add-e2 e) okolje))))) (int(+ (int-n (complex-b (mi2 (add-e1 e) okolje))) (int-n (complex-b (mi2 (add-e2 e) okolje))))))])]
- [(mul? e) (cond
- [(and (int? (mi2 (mul-e1 e) okolje)) (int? (mi2 (mul-e1 e) okolje))) (int(* (int-n (mi2 (mul-e1 e) okolje)) (int-n (mi2 (mul-e2 e) okolje))))]
- [(and (complex? (mi2 (mul-e1 e) okolje)) (complex? (mi2 (mul-e1 e) okolje))) (complex (int(* (int-n (complex-a (mi2 (mul-e1 e) okolje))) (int-n (complex-a (mi2 (mul-e2 e) okolje))))) (int(* (int-n (complex-b (mi2 (mul-e1 e) okolje))) (int-n (complex-b (mi2 (mul-e2 e) okolje))))))])]
- [(gt? e) (let ([v1 (mi2 (gt-e1 e) okolje)]
- [v2 (mi2 (gt-e2 e) okolje)])
- (if(> (int-n v1) (int-n v2)) (true) (false)))]
- [(both? e) (let ([v1 (mi2 (both-e1 e) okolje)]
- [v2 (mi2 (both-e2 e) okolje)])
- (cond [(and (true? (mi2 (is-bool v1) okolje)) (true? (mi2 (is-bool v2) okolje))) (if(and (true? v1) (true? v2)) (true) (false))]
- [else (false)]))]
- [(any? e) (let ([v1 (mi2 (any-e1 e) okolje)]
- [v2 (mi2 (any-e2 e) okolje)])
- (cond [(and (true? (mi2(is-bool v1) okolje)) (true? (mi2(is-bool v2) okolje))) (if(or (true? v1) (true? v2)) (true) (false))]
- [else (false)]))]
- [(!? e) (cond [(true? (mi2(is-bool (mi (!-e1 e) okolje))okolje )) (if(true? (mi2(!-e1 e) okolje)) (false) (true))]
- [else (false)])]
- [(hd? e) (let ([x (mi2 (hd-x e) okolje)])
- (::-e1 x))]
- [(tl? e) (let ([x (mi2 (tl-x e) okolje)])
- (::-e2 x))]
- [(is-empty? e) (if(empty? (mi2(is-empty-x e)okolje)) (true) (false))]
- [(@? e) (let([v1 (mi2 (@-a e) okolje)]
- [v2 (mi2 (@-b e) okolje)])
- (define (preglej sez)
- (if(::? sez) (append (list(mi2(hd sez)okolje)) (preglej (mi2 (tl sez) okolje))) (list(mi2 sez okolje))))
- (define (kreiraj list1 v2)
- (if(not(null? list1)) (mi2(:: (car list1) (kreiraj (cdr list1) v2)) okolje) v2))
- (kreiraj (preglej v1) v2))]
- [(real? e) (let([v1 (mi2 (real-e1 e) okolje)])
- (complex-a v1))]
- [(imaginary? e) (let([v1 (mi2 (imaginary-e1 e) okolje)])
- (complex-b v1))]
- [(var? e) (let ([s (var-s e)]
- [e1 (mi2 (var-e1 e) okolje)]
- [e2 (var-e2 e)])
- (mi2 e2 (append (list(cons s e1)) okolje)))]
- [(valof? e) (let ([s (valof-s e)])
- (cdr(assoc s okolje)))]
- [(fun? e) (envelope okolje e)]
- [(proc? e) e]
- [(call? e) (let([o (mi2 (call-e e) okolje) ])
- (cond [(envelope? o) (mi2 (fun-body (envelope-f o)) (let ([fargs (fun-fargs(envelope-f(mi2 (call-e e) okolje)))]
- [args (map (lambda(x) (mi2 x okolje)) (call-args e))])
- (append (list(cons (fun-name (envelope-f o)) o)) (map cons fargs args)) ))]
- [(proc? o) (mi2 (proc-body o) (append (list (cons (proc-name o) o)) okolje))]
- [else (error "klic funkcije nima ustreznih argumentov")]))]
- ))])
- (mi2 e okolje)))
- #| V jeziku Racket lahko implementiramo funkcije, ki delujejo kot makri v jeziku mega,
- ter na ta način olepšajo sintakso ter razširijo jezik z novimi konstrukti.
- Makri naj podane izraze evalvirajo le enkrat! Definiramo naslednje makre: |#
- ;(to-complex e1) iz rezultat izraza e1, ki je številska konstanta naredi kompleksno število
- (define-syntax to-complex
- (syntax-rules()
- [(to-complex e1)
- (complex e1 (int 0))]))
- ;(conj e1) predstavlja konjugirano kompleksno število, ki je rezultat izraza e1
- (define-syntax conj
- (syntax-rules()
- [(conj e1)
- (let ([a (complex-a e1)]
- [b (complex-b e1)])
- (complex a (int (-(int-n b))))
- )]))
- ;(~ e1) predstavlja unarni minus. Definiran je za številske konstante.
- (define-syntax ~
- (syntax-rules()
- [(~ e1)
- (int (-(int-n e1)))]))
- ;(lt e1 e2), ki preveri, ali velja urejenost med parametroma. Definiran je za vse vrednosti, na katerih deluje gt.
- (define-syntax lt
- (syntax-rules()
- [(lt e1 e2)
- (cond [(true) (gt e2 e1)]
- [else "napacna cifra"])]))
- ;(same e1 e2), ki preveri, ali sta vrednosti enaki. Definiran je za vse vrednosti, na katerih deluje gt.
- (define-syntax same
- (syntax-rules()
- [(same e1 e2)
- (cond [(true) (if(= (int-n e1) (int-n e2)) (true) (false))]
- [else "napacna cifra"])]))
- #|
- ;podatkovni tipi testi
- (mi (int 3) null)
- (mi (add (int 3) (int 5)) null)
- (mi (true) null)
- (mi (false) null)
- (mi (complex (int 3) (int 3)) null)
- (mi (complex (add (int 2) (int 2)) (add (int 1) (int 1))) null)
- (mi (empty) null)
- (mi (:: (int 3) (int 3)) null)
- (mi (:: (int 3) (:: (int 2) (int 2))) null)
- (mi (:: (complex (int 3) (int 3)) (complex (int 2) (int 2))) null)
- (mi (:: (add (complex (int 3) (int 2)) (complex (int 2) (int 2))) (complex (int 10) (int 10))) null)
- ;nadzor toka
- (mi (if-then-else (true) (int 10) (int 15)) null)
- (mi (if-then-else (false) (int 10) (int 15)) null)
- (mi (if-then-else (is-int (int 3)) (int 10) (int 15)) null)
- (mi (if-then-else (is-list(empty)) (int 10) (int 15)) null)
- (mi (is-int (int 3)) null)
- (mi (is-int (add (int 3) (int 5))) null)
- (mi (is-int (true)) null)
- (mi (is-int (false)) null)
- (mi (is-int (complex (int 3) (int 5))) null)
- (mi (is-int (:: (int 3) (int 5))) null)
- (mi (is-int (empty)) null)
- (mi (is-bool (true)) null)
- (mi (is-bool (false)) null)
- (mi (is-bool (is-int (int 3))) null)
- (mi (is-bool (empty)) null)
- (mi (is-bool (complex (int 3) (int 3))) null)
- (mi (is-bool (add (complex (int 3) (int 3)) (complex (int 5) (int 2)))) null)
- (mi (is-bool (:: (int 3) (int 5))) null)
- (mi (is-bool (empty)) null)
- (mi (is-complex (complex (int 2) (int 2))) null)
- (mi (is-complex (add (complex (int 1) (int 1)) (complex (int 2) (int 3)))) null)
- (mi (is-complex (complex (add (int 3) (int 5)) (int 11))) null)
- (mi (is-complex (true)) null)
- (mi (is-complex (false)) null)
- (mi (is-complex (:: (int 3) (int 5))) null)
- (mi (is-complex (empty)) null)
- (mi (is-complex (int 4)) null)
- (mi (is-list (empty)) null)
- (mi (is-list (:: (int 3) (add (int 2) (int 5)))) null)
- (mi (is-list (:: (int 3) (:: (int 5) (int 7)))) null)
- (mi (is-list (true)) null)
- (mi (is-list (false)) null)
- (mi (is-list (int 0)) null)
- (mi (is-list (add (int 3) (int 5))) null)
- (mi (is-list (complex (int 3) (add (int 7) (int 3)))) null)
- (mi (add (int 3) (int 4)) null)
- (mi (add (int 7) (add (int 9) (int 2))) null)
- (mi (add (complex (int 5) (int 5)) (complex (int 1) (int 20))) null)
- (mi (mul (int 3) (int 4)) null)
- (mi (mul (int 7) (add (int 9) (int 2))) null)
- (mi (mul (complex (int 5) (int 5)) (complex (int 1) (int 20))) null)
- (mi (gt (int 10) (int 3)) null)
- (mi (gt (add (int 5) (int 5)) (add (int 2) (int 3))) null)
- (mi (gt (int 10) (add (int 5) (int 5))) null)
- (mi (gt (int 3) (int 4)) null)
- (mi (both (true) (true)) null)
- (mi (both (is-int (int 3)) (true)) null)
- (mi (both (true) (false)) null)
- (mi (both (false) (true)) null)
- (mi (both (false) (false)) null)
- (mi (any (true) (true)) null)
- (mi (any (is-int (int 3)) (true)) null)
- (mi (any (true) (false)) null)
- (mi (any (false) (true)) null)
- (mi (any (false) (false)) null)
- (mi (any (is-int (int 3)) (is-int (int 3))) null)
- (mi (any (is-int (int 5)) (false)) null)
- (mi (! (true)) null)
- (mi (! (is-bool (true))) null)
- (mi (! (false)) null)
- (mi (! (if-then-else (true) (false) (int 5))) null)
- (mi (hd (:: (int 10) (:: (int 11) (:: (int 12) (int 13))))) null)
- (mi (tl (:: (int 10) (:: (int 11) (:: (int 12) (add (int 12) (int 1)))))) null)
- (mi (is-empty (:: (int 10) (:: (int 11) (:: (int 12) (add (int 12) (int 1)))))) null)
- (mi (is-empty (:: (complex (int 1) (int 1)) (complex (int 1) (int 2)))) null)
- (mi (is-empty (empty)) null)
- (mi (@ (:: (int 1) (:: (int 2) (add (int 2) (int 1)))) (:: (int 4) (:: (int 5) (int 6)))) null)
- (mi (real (complex (add (int 1) (int 1)) (add (int 2) (int 2)))) null)
- (mi (imaginary (complex (add (int 1) (int 1)) (add (int 2) (int 2)))) null)
- (mi (real (add (complex (int 1) (int 2)) (complex (int 1) (int 2)))) null)
- (mi (imaginary (add (complex (int 1) (int 2)) (complex (int 1) (int 2)))) null)
- ;spremenljivke
- (mi (var "i" (int 5) (valof "i")) null)
- (mi (var "i" (int 5) (var "j" (int 10) (var "g" (int 1) (mul (mul (valof "i") (valof "j")) (valof "g"))))) null)
- (mi (var "i" (int 5) (var "j" (int 10) (var "i" (int 1) (mul (mul (valof "i") (valof "j")) (valof "i"))))) null)
- (mi (var "i" (int 11) (is-int (valof "i"))) null)
- (mi (mul (valof "c") (valof "d")) (list (cons "c" (complex (int 2) (int 3))) (cons "d" (complex (int 5) (int 6)))))
- (mi (var "c" (complex (int 1) (int 2)) (mul (valof "c") (valof "d"))) (list (cons "c" (complex (int 2) (int 3))) (cons "d" (complex (int 5) (int 6)))))
- ;procedure
- (mi (call (proc "mnoziComplex" (mul (complex (int 2) (int 3)) (complex (int 4) (int 5)))) null) null)
- (mi (call (proc "mnoziOk1" (mul (valof "i") (valof "j"))) null) (list (cons "i" (int 10)) (cons "j" (int 3))))
- (mi (var "i" (int 100) (call (proc "mnoziOk1" (mul (valof "i") (valof "j"))) null)) (list (cons "i" (int 10)) (cons "j" (int 3))))
- ;procedure rekurzija
- (mi (var "x" (int 5)
- (call (proc "pow2"
- (if-then-else (gt (valof "x") (int 0))
- (var "x" (add (valof "x") (int -1)) (mul (int 2) (call (valof "pow2") null)))
- (int 1))) null)) null)
- ;makri
- (mi (to-complex (int 3)) null)
- (mi (to-complex (add (int 3) (valof "i"))) (list (cons "i" (int 10))))
- (mi (conj (complex (int 3) (int 10))) null)
- (mi (conj (complex (int 3) (int -10))) null)
- (mi (conj (complex (valof "i") (int 10))) (list (cons "i" (int 20))))
- (mi (~ (int 30)) null)
- (mi (~ (int -30)) null)
- (mi (lt (int 3) (int 5)) null)
- (mi (lt (int 5) (int 5)) null)
- (mi (lt (int 10) (int 5)) null)
- (mi (same (int 3) (int 3)) null)
- (mi (same (int 3) (int 4)) null)
- (mi (same (int 4) (int 3)) null)
- (mi (call (fun "nekaj" (list "n") (add (valof "n") (valof "n"))) (list (int 3))) null)
- (mi (var "n" (int 1000) (call (fun "nekaj" (list "n") (add (valof "n") (valof "n"))) (list (int 3)))) (list (cons "n" (int 100))))
- (define fib (fun "fib" (list "n")
- (if-then-else (gt (int 3) (valof "n"))
- (int 1)
- (add (call (valof "fib") (list (add (valof "n") (int -1))))
- (call (valof "fib") (list (add (valof "n") (int -2))))))))
- (mi (call fib (list (int 5))) null)
- (define reverse (fun "reverse" (list "xs")
- (if-then-else
- (is-empty (valof "xs"))
- (empty)
- (@ (call (valof "reverse") (list (tl (valof "xs"))))
- (:: (hd (valof "xs")) (empty))))))
- (mi (call reverse (list (:: (int 5) (:: (int 4) (:: (int 3) (empty)))))) null)
- (define tail-reverse (fun "tail-reverse" (list "xs")
- (var "aux" (fun "aux" (list "xs" "acc")
- (if-then-else
- (is-empty (valof "xs"))
- (valof "acc")
- (call (valof "aux") (list (tl (valof "xs")) (:: (hd (valof "xs")) (valof "acc"))))))
- (call (valof "aux") (list (valof "xs") (empty))))))
- (mi (call tail-reverse (list (:: (int 5) (:: (int 4) (:: (int 3) (empty)))))) null) |#
- (define fib (fun "fib" (list "n")
- (if-then-else (gt (int 3) (valof "n"))
- (int 1)
- (add (call (valof "fib") (list (add (valof "n") (int -1))))
- (call (valof "fib") (list (add (valof "n") (int -2))))))))
- (mi (call fib (list (int 11))) null)
- (define reverse (fun "reverse" (list "xs")
- (if-then-else
- (is-empty (valof "xs"))
- (empty)
- (@ (call (valof "reverse") (list (tl (valof "xs"))))
- (:: (empty) (hd (valof "xs")))))))
- (mi (call reverse (list (:: (int 5) (:: (int 4) (:: (int 3) (empty)))))) null)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement