Advertisement
Guest User

Untitled

a guest
May 19th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.58 KB | None | 0 0
  1. #lang racket
  2.  
  3. ;; definicja wyrażeń
  4.  
  5. (struct variable (x) #:transparent)
  6. (struct const (val) #:transparent)
  7. (struct op (symb l r) #:transparent)
  8. (struct let-expr (x e1 e2) #:transparent)
  9. (struct if-expr (b t e) #:transparent)
  10. (struct cons-expr (l r) #:transparent)
  11. (struct car-expr (p) #:transparent)
  12. (struct cdr-expr (p) #:transparent)
  13. (struct pair?-expr (p) #:transparent)
  14. (struct null-expr () #:transparent)
  15. (struct null?-expr (e) #:transparent)
  16. (struct symbol-expr (v) #:transparent)
  17. (struct symbol?-expr (e) #:transparent)
  18. (struct lambda-expr (xs b) #:transparent)
  19. (struct app-expr (f es) #:transparent)
  20. (struct apply-expr (f e) #:transparent)
  21. (struct closure (x b e))
  22.  
  23. (define (expr? e)
  24. (match e
  25. [(variable s) (symbol? s)]
  26. [(const n) (or (number? n)
  27. (boolean? n))]
  28. [(op s l r) (and (member s '(+ *))
  29. (expr? l)
  30. (expr? r))]
  31. [(let-expr x e1 e2) (and (symbol? x)
  32. (expr? e1)
  33. (expr? e2))]
  34. [(if-expr b t e) (andmap expr? (list b t e))]
  35. [(cons-expr l r) (andmap expr? (list l r))]
  36. [(car-expr p) (expr? p)]
  37. [(cdr-expr p) (expr? p)]
  38. [(pair?-expr p) (expr? p)]
  39. [(null-expr) true]
  40. [(null?-expr p) (expr? p)]
  41. [(symbol-expr v) (symbol? v)]
  42. [(symbol?-expr p) (expr? p)]
  43. [(lambda-expr xs b) (and (list? xs)
  44. (andmap symbol? xs)
  45. (expr? b)
  46. (not (check-duplicates xs)))]
  47. [(app-expr f es) (and (expr? f)
  48. (list? es)
  49. (andmap expr? es))]
  50. [(apply-expr f e) (and (expr? f)
  51. (expr? e))]
  52. [_ false]))
  53.  
  54. ;; wartości zwracane przez interpreter
  55.  
  56. (struct val-symbol (s) #:transparent)
  57.  
  58. (define (my-value? v)
  59. (or (number? v)
  60. (boolean? v)
  61. (and (pair? v)
  62. (my-value? (car v))
  63. (my-value? (cdr v)))
  64. ; null-a reprezentujemy symbolem (a nie racketowym
  65. ; nullem) bez wyraźnej przyczyny
  66. (and (symbol? v) (eq? v 'null))
  67. (and ((val-symbol? v) (symbol? (val-symbol-s v))))))
  68.  
  69. ;; wyszukiwanie wartości dla klucza na liście asocjacyjnej
  70. ;; dwuelementowych list
  71.  
  72. (define (lookup x xs)
  73. (cond
  74. [(null? xs)
  75. (error x "unknown identifier :(")]
  76. [(eq? (caar xs) x) (cadar xs)]
  77. [else (lookup x (cdr xs))]))
  78.  
  79. ;; kilka operatorów do wykorzystania w interpreterze
  80.  
  81. (define (op-to-proc x)
  82. (lookup x `(
  83. (+ ,+)
  84. (* ,*)
  85. (- ,-)
  86. (/ ,/)
  87. (> ,>)
  88. (>= ,>=)
  89. (< ,<)
  90. (<= ,<=)
  91. (= ,=)
  92. (eq? ,(lambda (x y) (eq? (val-symbol-s x)
  93. (val-symbol-s y))))
  94. )))
  95.  
  96. ;; interfejs do obsługi środowisk
  97.  
  98. (define (env-empty) null)
  99. (define env-lookup lookup)
  100. (define (env-add x v env)
  101. (cond [(or (and (null? x) (not (null? v))) (and (null? v) (not (null? x))))
  102. (error "różne liczby argumentów :(")]
  103. [(symbol? x) (cons (list x v) env)]
  104. [(and (null? x) (null? v)) env]
  105. [else (let ([cdv (if (pair? v) (cdr v) null)]
  106. [cdx (if (pair? x) (cdr x) null)]
  107. [cav (if (pair? v) (car v) v)]
  108. [cax (if (pair? x) (car x) x)])
  109. (env-add cdx cdv (cons (list cax cav) env)))]))
  110.  
  111. (define (env? e)
  112. (and (list? e)
  113. (andmap (lambda (xs) (and (list? e)
  114. (= (length e) 2)
  115. (symbol? (first e)))))))
  116.  
  117. ;; interpretacja wyrażeń
  118.  
  119. (define (eval e env)
  120. (match e
  121. [(const n) n]
  122. [(op s l r)
  123. ((op-to-proc s) (eval l env)
  124. (eval r env))]
  125. [(let-expr x e1 e2)
  126. (let ((v1 (eval e1 env)))
  127. (eval e2 (env-add x v1 env)))]
  128. [(variable x) (env-lookup x env)]
  129. [(if-expr b t e) (if (eval b env)
  130. (eval t env)
  131. (eval e env))]
  132. [(cons-expr l r)
  133. (let ((vl (eval l env)) ;; dodawanie zmiennych do env
  134. (vr (eval r env)))
  135. (cons vl vr))]
  136. [(car-expr p) (car (eval p env))]
  137. [(cdr-expr p) (cdr (eval p env))]
  138. [(pair?-expr p) (pair? (eval p env))]
  139. [(null-expr) 'null]
  140. [(null?-expr e) (eq? (eval e env) 'null)]
  141. [(symbol-expr v) (val-symbol v)]
  142. [(lambda-expr xs b) (closure xs b env)]
  143. [(app-expr f e) (let ((vf (eval f env))
  144. (ve e))
  145. (match vf
  146. [(closure x b c-env)
  147. (eval b (env-add x ve c-env))]
  148. [_ (error "application: not a function :(")]))]
  149. [(apply-expr f e) (let ([vf (eval f env)]
  150. [ve (eval e env)])
  151. (match vf
  152. [(closure x b c-env)
  153. (eval b (env-add x ve c-env))]))]))
  154.  
  155. (define (run e)
  156. (eval e (env-empty)))
  157.  
  158. (define gg
  159. (let-expr 'foo
  160. (lambda-expr '(x y z)
  161. (op '+ (variable 'x) (op '+ (variable 'y) (variable 'z))))
  162. (apply-expr (variable 'foo) (cons-expr (const 1) (cons-expr (const 2) (const 3))))))
  163. (my-value? (run gg))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement