Advertisement
Guest User

Untitled

a guest
Jan 8th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 9.10 KB | None | 0 0
  1. #lang racket
  2. (struct int (n) #:transparent)
  3. (struct true () #:transparent)
  4. (struct false () #:transparent)
  5.  
  6. (struct complex (a b) #:transparent)
  7. (struct empty () #:transparent)
  8.  
  9. (struct :: (e1 e2) #:transparent)
  10. (struct if-then-else (condition e1 e2) #:transparent)
  11.  
  12. (struct is-int (e1) #:transparent)
  13. (struct is-bool (e1) #:transparent)
  14. (struct is-complex (e1) #:transparent)
  15. (struct is-list (e1) #:transparent)
  16. (struct add (e1 e2) #:transparent)
  17. (struct mul (e1 e2) #:transparent)
  18. (struct gt (e1 e2) #:transparent)
  19.  
  20. (struct both (e1 e2) #:transparent)
  21. (struct any (e1 e2) #:transparent)
  22. (struct ! (e1) #:transparent)
  23.  
  24. (struct hd (x) #:transparent)
  25. (struct tl (x) #:transparent)
  26. (struct is-empty (x) #:transparent)
  27. (struct @ (a b) #:transparent)
  28.  
  29. (struct real (e1) #:transparent)
  30. (struct imaginary (e1) #:transparent)
  31.  
  32. (struct var (s e1 e2) #:transparent)
  33. (struct valof (s) #:transparent)
  34.  
  35. (struct fun (name fargs body) #:transparent)
  36. (struct proc (name body) #:transparent)
  37. (struct envelope (env f) #:transparent)
  38. (struct call (e args) #:transparent)
  39. ;
  40.  
  41. (define (mi e okolje)
  42.   (letrec ([mi2 (lambda (e okolje)
  43.                   (cond
  44.                     #|Podatkovni tipi |#
  45.                     [(int? e) e]
  46.                     [(true? e) e]
  47.                     [(false? e) e]
  48.                     [(complex? e) (let
  49.                                       ([v1 (mi2 (complex-a e) okolje)]
  50.                                        [v2 (mi2 (complex-b e) okolje)])
  51.                                     (complex v1 v2))]
  52.                     [(::? e) (let
  53.                                  ([v1 (mi2(::-e1 e) okolje)]
  54.                                   [v2 (mi2(::-e2 e) okolje)])
  55.                                (:: v1 v2)
  56.                                )]  
  57.                     [(empty? e) e]
  58.                     #|Nadzor toka|#
  59.                     [(if-then-else? e) (let ([c (mi2(if-then-else-condition e) okolje)]
  60.                                              [e1 (if-then-else-e1 e)]
  61.                                              [e2 (if-then-else-e2 e)])
  62.                                          (if(true? c) (mi2 e1 okolje) (mi2 e2 okolje)))]
  63.                     [(is-int? e) (if(int? (mi2 (is-int-e1 e) okolje)) (true) (false))]
  64.    
  65.                     [(is-bool? e) (cond [(true? (mi2 (is-bool-e1 e) okolje)) (true)]
  66.                                         [(false? (mi2 (is-bool-e1 e) okolje)) (true)]
  67.                                         [else (false)])]
  68.    
  69.                     [(is-complex? e) (if(complex? (mi2 (is-complex-e1 e) okolje)) (true) (false))]
  70.    
  71.                     [(is-list? e) (cond [(empty? (mi2 (is-list-e1 e) okolje)) (true)]
  72.                                         [(::? (mi2 (is-list-e1 e) okolje)) (true)]
  73.                                         [else (false)])]
  74.  
  75.                     [(add? e) (cond
  76.                                 [(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))))]
  77.                                 [(and (complex? (mi2 (add-e1 e) okolje)) (complex? (mi2 (add-e1 e) okolje))) (complex (+ (int-n (complex-a (mi2 (add-e1 e) okolje))) (int-n (complex-a (mi2 (add-e2 e) okolje))))  (+ (int-n (complex-b (mi2 (add-e1 e) okolje))) (int-n (complex-b (mi2 (add-e2 e) okolje)))))])]
  78.  
  79.                     [(mul? e) (cond
  80.                                 [(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))))]
  81.                                 [(and (complex? (mi2 (mul-e1 e) okolje)) (complex? (mi2 (mul-e1 e) okolje))) (complex (* (int-n (complex-a (mi2 (mul-e1 e) okolje))) (int-n (complex-a (mi2 (mul-e2 e) okolje))))  (* (int-n (complex-b (mi2 (mul-e1 e) okolje))) (int-n (complex-b (mi2 (mul-e2 e) okolje)))))])]
  82.  
  83.                     [(gt? e) (let ([v1 (mi2 (gt-e1 e) okolje)]
  84.                                    [v2 (mi2 (gt-e2 e) okolje)])
  85.                                (if(> (int-n v1) (int-n v2)) (true) (false)))]
  86.    
  87.                     [(both? e) (let ([v1 (mi2 (both-e1 e) okolje)]
  88.                                      [v2 (mi2 (both-e2 e) okolje)])
  89.                                  (cond [(and (true? (mi2 (is-bool v1) okolje)) (true? (mi2 (is-bool v2) okolje))) (if(and (true? v1) (true? v2)) (true) (false))]
  90.                                        [else (false)]))]
  91.    
  92.                     [(any? e) (let ([v1 (mi2 (any-e1 e) okolje)]
  93.                                     [v2 (mi2 (any-e2 e) okolje)])
  94.                                 (cond [(and (true? (mi2(is-bool v1) okolje)) (true? (mi2(is-bool v2) okolje))) (if(or (true? v1) (true? v2)) (true) (false))]
  95.                                       [else (false)]))]
  96.    
  97.                     [(!? e) (cond [(true? (mi2(is-bool (mi (!-e1 e) okolje))okolje )) (if(true? (mi2(!-e1 e) okolje)) (false) (true))]
  98.                                   [else (false)])]
  99.  
  100.                     [(hd? e) (let ([x (mi2 (hd-x e) okolje)])
  101.                                (::-e1 x))]
  102.  
  103.                     [(tl? e) (let ([x (mi2 (tl-x e) okolje)])
  104.                                (::-e2 x))]
  105.  
  106.                     [(is-empty? e) (if(empty? (mi2(is-empty-x e)okolje)) (true) (false))]
  107.  
  108.                     [(@? e) (let([v1 (mi2 (@-a e) okolje)]
  109.                                  [v2 (mi2 (@-b e) okolje)])
  110.  
  111.                               (define (preglej sez)
  112.                                 (if(::? sez) (append (list(mi2(hd sez)okolje)) (preglej (mi2 (tl sez) okolje))) (list(mi2 sez okolje))))
  113.  
  114.                               (define (kreiraj list1 v2)
  115.                                 (if(not(null? list1))  (mi2(:: (car list1) (kreiraj (cdr list1) v2)) okolje) v2))
  116.              
  117.                               (kreiraj (preglej v1) v2))]
  118.  
  119.                     [(real? e) (let([v1 (mi2 (real-e1 e) okolje)])
  120.                                  (complex-a v1))]
  121.    
  122.                     [(imaginary? e) (let([v1 (mi2 (imaginary-e1 e) okolje)])
  123.                                       (complex-b v1))]
  124.    
  125.                     [(var? e) (let ([s (var-s e)]
  126.                                     [e1 (mi2 (var-e1 e) okolje)]
  127.                                     [e2 (var-e2 e)])
  128.                                 (mi2 e2 (append (list(cons s e1)) okolje)))]
  129.                    
  130.                     [(valof? e) (let ([s (valof-s e)])
  131.                                    (cdr(assoc s okolje)))]
  132.                    
  133.                     [(fun? e) (envelope okolje e)]
  134.  
  135.                     [(proc? e) e]
  136.                    
  137.                     [(call? e) (let([o (mi2 (call-e e) okolje) ])
  138.                                  (cond [(envelope? o) (mi2 (fun-body (envelope-f o)) (let ([fargs (fun-fargs(call-e e))]
  139.                                                                                            [args (map (lambda(x) (mi2 x okolje)) (call-args e))])
  140.                                                                                        (map cons fargs args)))]
  141.                                        [(proc? o) (mi2 (proc-body o) okolje)]
  142.                                        [else (error "klic funkcije nima ustreznih argumentov")]))]
  143.                     ))])
  144.     (mi2 e okolje)))
  145.  
  146. #| V jeziku Racket lahko implementiramo funkcije, ki delujejo kot makri v jeziku mega,
  147. ter na ta način olepšajo sintakso ter razširijo jezik z novimi konstrukti.
  148. Makri naj podane izraze evalvirajo le enkrat! Definiramo naslednje makre: |#
  149.  
  150. ;(to-complex e1) iz rezultat izraza e1, ki je številska konstanta naredi kompleksno število
  151. (define-syntax to-complex
  152.   (syntax-rules()
  153.     [(to-complex e1)
  154.     (complex (mi e1) (int 0))]))
  155.  
  156. ;(conj e1) predstavlja konjugirano kompleksno število, ki je rezultat izraza e1
  157. (define-syntax conj
  158.   (syntax-rules()
  159.     [(conj e1)
  160.     (let ([a (mi (complex-a e1))]
  161.           [b (mi(complex-b e1))])
  162.       (complex a (int (-(int-n b))))
  163.       )]))
  164.  
  165. ;(~ e1) predstavlja unarni minus. Definiran je za številske konstante.
  166. (define-syntax ~
  167.   (syntax-rules()
  168.     [(~ e1)
  169.     (int (-(int-n (mi e1))))]))
  170.  
  171. ;(lt e1 e2), ki preveri, ali velja urejenost med parametroma. Definiran je za vse vrednosti, na katerih deluje gt.
  172. (define-syntax lt
  173.   (syntax-rules()
  174.     [(lt e1 e2)
  175.     (cond [(true) (gt e2 e1)]
  176.           [else "napacna cifra"])]))
  177.  
  178. ;(same e1 e2), ki preveri, ali sta vrednosti enaki. Definiran je za vse vrednosti, na katerih deluje gt.
  179. (define-syntax same
  180.   (syntax-rules()
  181.     [(same e1 e2)
  182.     (cond [(true) (if(= (int-n (mi e1)) (int-n (mi e2))) (true) (false))]
  183.           [else "napacna cifra"])]))
  184.  
  185. ;(envelope (list (cons "f" (int 3))) (fun "sestej" '("f" "a") (add (int 3) (int 5))))
  186. ;(mi (var "f" (int 3) (fun "sestej" (list "f" "a") (add (int 3) (int 5)))))
  187.  
  188. ;(mi (var "f" (int 11) (var "a" (int 1) (call (proc "sestej" (call (proc "sestej" (add (int 3) (int 8))) null) ) null ))))
  189.  
  190. ;(mi (call (fun "sestej" (list "a" "b") (add (int 3) (int 5))) (list (int 3) (int 7))))
  191.  
  192. ;(map cons (list 3 3 3) (list 4 4 4))
  193.  
  194. ;(mi (var "i" (int 777) (call (fun "sestej" (list "i" "f") (add (valof "i") (valof "f"))) (list (int 7) (int 1)) ) ))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement