Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 10.30 KB | None | 0 0
  1. #lang racket
  2.  
  3. ;; pomocnicza funkcja dla list tagowanych o określonej długości
  4.  
  5. (define (tagged-tuple? tag len p)
  6.   (and (list? p)
  7.        (= (length p) len)
  8.        (eq? (car p) tag)))
  9.  
  10. (define (tagged-list? tag p)
  11.   (and (pair? p)
  12.        (eq? (car p) tag)
  13.        (list? (cdr p))))
  14.  
  15. ;; self-evaluating expressions
  16.  
  17. (define (const? t)
  18.   (or (number? t)
  19.       (my-symbol? t)
  20.       (eq? t 'true)
  21.       (eq? t 'false)))
  22.  
  23. ;; arithmetic expressions
  24.  
  25. (define (op? t)
  26.   (and (list? t)
  27.        (member (car t) '(+ - * / = > >= < <= eq?))))
  28.  
  29. (define (op-op e)
  30.   (car e))
  31.  
  32. (define (op-args e)
  33.   (cdr e))
  34.  
  35. (define (op-cons op args)
  36.   (cons op args))
  37.  
  38. (define (op->proc op)
  39.   (cond [(eq? op '+) +]
  40.         [(eq? op '*) *]
  41.         [(eq? op '-) -]
  42.         [(eq? op '/) /]
  43.         [(eq? op '=)  (compose bool->val =)]
  44.         [(eq? op '>)  (compose bool->val >)]
  45.         [(eq? op '>=) (compose bool->val >=)]
  46.         [(eq? op '<)  (compose bool->val <)]
  47.         [(eq? op '<=) (compose bool->val <=)]
  48.         [(eq? op 'eq?) (lambda (x y)
  49.                          (bool->val (eq? (symbol-symbol x)
  50.                                          (symbol-symbol y))))]))
  51.  
  52. ;; symbols
  53.  
  54. (define (my-symbol? e)
  55.   (and (tagged-tuple? 'quote 2 e)
  56.        (symbol? (second e))))
  57.  
  58. (define (symbol-symbol e)
  59.   (second e))
  60.  
  61. (define (symbol-cons s)
  62.   (list 'quote s))
  63.  
  64. ;; lets
  65.  
  66. (define (let-def? t)
  67.   (and (list? t)
  68.        (= (length t) 2)
  69.        (symbol? (car t))))
  70.  
  71. (define (let-def-var e)
  72.   (car e))
  73.  
  74. (define (let-def-expr e)
  75.   (cadr e))
  76.  
  77. (define (let-def-cons x e)
  78.   (list x e))
  79.  
  80. (define (let? t)
  81.   (and (tagged-tuple? 'let 3 t)
  82.        (let-def? (cadr t))))
  83.  
  84. (define (let-def e)
  85.   (cadr e))
  86.  
  87. (define (let-expr e)
  88.   (caddr e))
  89.  
  90. (define (let-cons def e)
  91.   (list 'let def e))
  92.  
  93. ;; variables
  94.  
  95. (define (var? t)
  96.   (symbol? t))
  97.  
  98. (define (var-var e)
  99.   e)
  100.  
  101. (define (var-cons x)
  102.   x)
  103.  
  104. ;; pairs
  105.  
  106. (define (cons? t)
  107.   (tagged-tuple? 'cons 3 t))
  108.  
  109. (define (cons-fst e)
  110.   (second e))
  111.  
  112. (define (cons-snd e)
  113.   (third e))
  114.  
  115. (define (cons-cons e1 e2)
  116.   (list 'cons e1 e2))
  117.  
  118. (define (car? t)
  119.   (tagged-tuple? 'car 2 t))
  120.  
  121. (define (car-expr e)
  122.   (second e))
  123.  
  124. (define (cdr? t)
  125.   (tagged-tuple? 'cdr 2 t))
  126.  
  127. (define (cdr-expr e)
  128.   (second e))
  129.  
  130. (define (pair?? t)
  131.   (tagged-tuple? 'pair? 2 t))
  132.  
  133. (define (pair?-expr e)
  134.   (second e))
  135.  
  136. (define (pair?-cons e)
  137.   (list 'pair? e))
  138.  
  139.  
  140. ;; if
  141.  
  142. (define (if? t)
  143.   (tagged-tuple? 'if 4 t))
  144.  
  145. (define (if-cons b t f)
  146.   (list 'if b t f))
  147.  
  148. (define (if-cond e)
  149.   (second e))
  150.  
  151. (define (if-then e)
  152.   (third e))
  153.  
  154. (define (if-else e)
  155.   (fourth e))
  156.  
  157. ;; cond
  158.  
  159. (define (cond-clause? t)
  160.   (and (list? t)
  161.        (= (length t) 2)))
  162.  
  163. (define (cond-clause-cond c)
  164.   (first c))
  165.  
  166. (define (cond-clause-expr c)
  167.   (second c))
  168.  
  169. (define (cond-claue-cons b e)
  170.   (list b e))
  171.  
  172. (define (cond? t)
  173.   (and (tagged-list? 'cond t)
  174.        (andmap cond-clause? (cdr t))))
  175.  
  176. (define (cond-clauses e)
  177.   (cdr e))
  178.  
  179. (define (cond-cons cs)
  180.   (cons 'cond cs))
  181.  
  182. ;; lists
  183.  
  184. (define (my-null? t)
  185.   (eq? t 'null))
  186.  
  187. (define (null?? t)
  188.   (tagged-tuple? 'null? 2 t))
  189.  
  190. (define (null?-expr e)
  191.   (second e))
  192.  
  193. (define (null?-cons e)
  194.   (list 'null? e))
  195.  
  196. ;; lambdas
  197.  
  198. (define (lambda? t)
  199.   (and (tagged-tuple? 'lambda 3 t)
  200.        (list? (cadr t))
  201.        (andmap symbol? (cadr t))))
  202.  
  203. (define (lambda-cons vars e)
  204.   (list 'lambda vars e))
  205.  
  206. (define (lambda-vars e)
  207.   (cadr e))
  208.  
  209. (define (lambda-expr e)
  210.   (caddr e))
  211.  
  212. ;; lambda-rec
  213.  
  214. (define (lambda-rec? t)
  215.   (and (tagged-tuple? 'lambda-rec 3 t)
  216.        (list? (cadr t))
  217.        (>= (length (cadr t)) 1)
  218.        (andmap symbol? (cadr t))))
  219.  
  220. (define (lambda-rec-cons vars e)
  221.   (list 'lambda-rec vars e))
  222.  
  223. (define (lambda-rec-expr e)
  224.   (third e))
  225.  
  226. (define (lambda-rec-name e)
  227.   (car (second e)))
  228.  
  229. (define (lambda-rec-vars e)
  230.   (cdr (second e)))
  231.  
  232. ;; applications
  233.  
  234. (define (app? t)
  235.   (and (list? t)
  236.        (> (length t) 0)))
  237.  
  238. (define (app-cons proc args)
  239.   (cons proc args))
  240.  
  241. (define (app-proc e)
  242.   (car e))
  243.  
  244. (define (app-args e)
  245.   (cdr e))
  246.  
  247. ;; expressions
  248.  
  249. (define (expr? t)
  250.   (or (const? t)
  251.       (and (op? t)
  252.            (andmap expr? (op-args t)))
  253.       (and (let? t)
  254.            (expr? (let-expr t))
  255.            (expr? (let-def-expr (let-def t))))
  256.       (and (cons? t)
  257.            (expr? (cons-fst t))
  258.            (expr? (cons-snd t)))
  259.       (and (car? t)
  260.            (expr? (car-expr t)))
  261.       (and (cdr? t)
  262.            (expr? (cdr-expr t)))
  263.       (and (pair?? t)
  264.            (expr? (pair?-expr t)))
  265.       (my-null? t)
  266.       (and (null?? t)
  267.            (expr? (null?-expr t)))
  268.       (and (if? t)
  269.            (expr? (if-cond t))
  270.            (expr? (if-then t))
  271.            (expr? (if-else t)))
  272.       (and (cond? t)
  273.            (andmap (lambda (c)
  274.                       (and (expr? (cond-clause-cond c))
  275.                            (expr? (cond-clause-expr c))))
  276.                    (cond-clauses t)))
  277.       (and (lambda? t)
  278.            (expr? (lambda-expr t)))
  279.       (and (lambda-rec? t)
  280.            (expr? (lambda-rec-expr t)))
  281.       (var? t)
  282.       (and (app? t)
  283.            (expr? (app-proc t))
  284.            (andmap expr? (app-args t)))))
  285.  
  286. ;; environments
  287.  
  288. (define empty-env
  289.   null)
  290.  
  291. (define (add-to-env x v env)
  292.   (cons (list 'let x v) env))
  293.  
  294. (define (add-to-env-ll x v env)
  295.   (cons (list 'lazy-let x v env) env))
  296.  
  297.  
  298. (define (elem-tag env)
  299.   (caar env))
  300.  
  301. (define (elem-var env)
  302.   (cadar env))
  303.  
  304. (define (elem-expr env)
  305.   (caddar env))
  306.  
  307. (define (elem-env env)
  308.   (car (cdddar env)))
  309.  
  310. (define (find-in-env x env)
  311.   (cond [(null? env) (error "undefined variable" x)]
  312.         [(eq? x (elem-var env)) (if (eq? (elem-tag env) 'let)
  313.                                     (elem-expr env)
  314.                                     (eval-env (elem-expr env) (elem-env env)))]
  315.         [else (find-in-env x (cdr env))]))
  316.  
  317. ;; closures
  318.  
  319. (define (closure-cons xs expr env)
  320.   (list 'closure xs expr env))
  321.  
  322. (define (closure? c)
  323.   (and (list? c)
  324.        (= (length c) 4)
  325.        (eq? (car c) 'closure)))
  326.  
  327. (define (closure-vars c)
  328.   (cadr c))
  329.  
  330. (define (closure-expr c)
  331.   (caddr c))
  332.  
  333. (define (closure-env c)
  334.   (cadddr c))
  335.  
  336. ;; closure-rec
  337.  
  338. (define (closure-rec? t)
  339.   (tagged-tuple? 'closure-rec 5 t))
  340.  
  341. (define (closure-rec-name e)
  342.   (second e))
  343.  
  344. (define (closure-rec-vars e)
  345.   (third e))
  346.  
  347. (define (closure-rec-expr e)
  348.   (fourth e))
  349.  
  350. (define (closure-rec-env e)
  351.   (fifth e))
  352.  
  353. (define (closure-rec-cons f xs e env)
  354.   (list 'closure-rec f xs e env))
  355.  
  356. ;; evaluator
  357.  
  358. (define (bool->val b)
  359.   (if b 'true 'false))
  360.  
  361. (define (val->bool s)
  362.   (cond [(eq? s 'true) true]
  363.         [(eq? s 'false) false]
  364.         [else (error "could not convert symbol to bool")]))
  365.  
  366. (define (eval-env e env)
  367.   (cond [(const? e)
  368.          e]
  369.         [(op? e)
  370.          (apply (op->proc (op-op e))
  371.                 (map (lambda (a) (eval-env a env))
  372.                      (op-args e)))]
  373.         [(lazy-let? e)
  374.          (eval-env (lazy-let-expr e)
  375.                    (env-for-lazy-let (lazy-let-def e) env))]
  376.         [(let? e)
  377.          (eval-env (let-expr e)
  378.                    (env-for-let (let-def e) env))]
  379.         [(my-null? e)
  380.         null]
  381.         [(cons? e)
  382.          (cons (eval-env (cons-fst e) env)
  383.                (eval-env (cons-snd e) env))]
  384.         [(car? e)
  385.          (car (eval-env (car-expr e) env))]
  386.         [(cdr? e)
  387.          (cdr (eval-env (cdr-expr e) env))]
  388.         [(pair?? e)
  389.          (bool->val (pair? (eval-env (pair?-expr e) env)))]
  390.         [(null?? e)
  391.          (bool->val (null? (eval-env (null?-expr e) env)))]
  392.         [(if? e)
  393.          (if (val->bool (eval-env (if-cond e) env))
  394.              (eval-env (if-then e) env)
  395.              (eval-env (if-else e) env))]
  396.         [(cond? e)
  397.          (eval-cond-clauses (cond-clauses e) env)]
  398.         [(var? e)
  399.          (find-in-env (var-var e) env)]
  400.         [(lambda? e)
  401.          (closure-cons (lambda-vars e) (lambda-expr e) env)]
  402.         [(lambda-rec? e)
  403.          (closure-rec-cons (lambda-rec-name e)
  404.                            (lambda-rec-vars e)
  405.                            (lambda-rec-expr e)
  406.                            env)]
  407.         [(app? e)
  408.          (apply-closure
  409.            (eval-env (app-proc e) env)
  410.            (map (lambda (a) (eval-env a env))
  411.                 (app-args e)))]))
  412.  
  413. (define (eval-cond-clauses cs env)
  414.   (if (null? cs)
  415.       (error "no true clause in cond")
  416.       (let ([cond (cond-clause-cond (car cs))]
  417.             [expr (cond-clause-expr (car cs))])
  418.            (if (val->bool (eval-env cond env))
  419.                (eval-env expr env)
  420.                (eval-cond-clauses (cdr cs) env)))))
  421.  
  422. (define (apply-closure c args)
  423.   (cond [(closure? c)
  424.          (eval-env
  425.             (closure-expr c)
  426.             (env-for-closure
  427.               (closure-vars c)
  428.               args
  429.               (closure-env c)))]
  430.         [(closure-rec? c)
  431.          (eval-env
  432.            (closure-rec-expr c)
  433.            (add-to-env
  434.             (closure-rec-name c)
  435.             c
  436.             (env-for-closure
  437.               (closure-rec-vars c)
  438.               args
  439.               (closure-rec-env c))))]))
  440.  
  441. (define (env-for-closure xs vs env)
  442.   (cond [(and (null? xs) (null? vs)) env]
  443.         [(and (not (null? xs)) (not (null? vs)))
  444.          (add-to-env
  445.            (car xs)
  446.            (car vs)
  447.            (env-for-closure (cdr xs) (cdr vs) env))]
  448.         [else (error "arity mismatch")]))
  449.  
  450. (define (env-for-let def env)
  451.   (add-to-env
  452.     (let-def-var def)
  453.     (eval-env (let-def-expr def) env)
  454.     env))
  455.  
  456. (define (eval e)
  457.   (eval-env e empty-env))
  458.  
  459.  
  460. ;; lazy-lets
  461.  
  462. (define (lazy-let-def? e)
  463.   (and (list? e)
  464.        (= (length e) 2)
  465.        (var? (car e))))
  466.  
  467. (define (lazy-let? e)
  468.   (and (tagged-tuple? 'lazy-let 3 e)
  469.        (lazy-let-def? (lazy-let-def e))))
  470.  
  471. (define (lazy-let-def e)
  472.   (cadr e))
  473.  
  474. (define (lazy-let-def-var e)
  475.   (car e))
  476.  
  477. (define (lazy-let-def-expr e)
  478.   (cadr e))
  479.  
  480. (define (lazy-let-expr e)
  481.   (caddr e))
  482.  
  483. (define (lazy-let-cons def expr)
  484.   (list 'lazy-let def expr))
  485.  
  486. (define (env-for-lazy-let def env)
  487.   (add-to-env-ll
  488.    (lazy-let-def-var def)
  489.    (lazy-let-def-expr def)
  490.    env))
  491.  
  492. ;; test dla factorial
  493.  
  494. (define factorial
  495.   '(lambda-rec (fact n)
  496.                (lazy-let (t 1)
  497.                          (lazy-let (f (* n (fact (- n 1))))
  498.                                    (if (= n 0) t f)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement