Advertisement
Guest User

LISTA 6

a guest
Jun 11th, 2018
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 6.63 KB | None | 0 0
  1. #lang racket
  2.  
  3. ;; arithmetic expressions
  4.  
  5. (define (const? t)
  6.   (number? t))
  7.  
  8. (define (binop? t)
  9.   (and (list? t)
  10.        (= (length t) 3)
  11.        (member (car t) '(+ - * /))))
  12.  
  13. (define (binop-op e)
  14.   (car e))
  15.  
  16. (define (binop-left e)
  17.   (cadr e))
  18.  
  19. (define (binop-right e)
  20.   (caddr e))
  21.  
  22. (define (binop-cons op l r)
  23.   (list op l r))
  24.  
  25. (define (arith-expr? t)
  26.   (or (const? t)
  27.       (and (binop? t)
  28.            (arith-expr? (binop-left  t))
  29.            (arith-expr? (binop-right t)))))
  30.  
  31. ;; calculator
  32.  
  33. (define (op->proc op)
  34.   (cond [(eq? op '+) +]
  35.         [(eq? op '*) *]
  36.         [(eq? op '-) -]
  37.         [(eq? op '/) /]))
  38.  
  39. (define (eval-arith e)
  40.   (cond [(const? e) e]
  41.         [(binop? e)
  42.          ((op->proc (binop-op e))
  43.           (eval-arith (binop-left  e))
  44.           (eval-arith (binop-right e)))]
  45.         [(op? e)
  46.          (apply
  47.           (op->proc (op-op e))
  48.           (map eval-arith (op-args e)))]))
  49.          
  50.  
  51. ;; let expressions
  52.  
  53. (define (let-def? t)
  54.   (and (list? t)
  55.        (= (length t) 2)
  56.        (symbol? (car t))))
  57.  
  58. (define (let-def-var e)
  59.   (car e))
  60.  
  61. (define (let-def-expr e)
  62.   (cadr e))
  63.  
  64. (define (let-def-cons x e)
  65.   (list x e))
  66.  
  67. (define (let? t)
  68.   (and (list? t)
  69.        (= (length t) 3)
  70.        (eq? (car t) 'let)
  71.        (andmap let-def? (cadr t))))
  72.  
  73. (define (let-def e)
  74.   (car e))
  75.  
  76. (define (let-defs e)
  77.   (cadr e))
  78.  
  79. (define (let-expr e)
  80.   (caddr e))
  81.  
  82. (define (let-cons def e)
  83.   (list 'let def e))
  84.  
  85. (define (var? t)
  86.   (symbol? t))
  87.  
  88. (define (var-var e)
  89.   e)
  90.  
  91. (define (var-cons x)
  92.   x)
  93.  
  94. (define (arith/let-expr? t)
  95.   (or (const? t)
  96.       (and (binop? t)
  97.            (arith/let-expr? (binop-left  t))
  98.            (arith/let-expr? (binop-right t)))
  99.       (and (op? t)
  100.            (andmap arith/let-expr? (op-args t)))
  101.       (and (op? t)
  102.            (andmap arith/let-expr? (op-args t)))
  103.       (and (let? t)
  104.            (arith/let-expr? (let-expr t))
  105.            (arith/let-expr?-for-defs (let-defs t)))
  106.       (var? t)))
  107.  
  108. (define (arith/let-expr?-for-defs e)
  109.   (if (null? e)
  110.       #t
  111.       (and (arith/let-expr? (let-def-expr (let-def e)))
  112.            (arith/let-expr?-for-defs (cdr e)))))
  113.  
  114. ;; evaluation via substitution
  115.  
  116. (define (subst e x f)
  117.   (cond [(const? e) e]
  118.         [(binop? e)
  119.          (binop-cons
  120.            (binop-op e)
  121.            (subst (binop-left  e) x f)
  122.            (subst (binop-right e) x f))]
  123.         [(let? e)
  124.          (let-cons
  125.            (let-def-cons
  126.              (let-def-var (let-defs e))
  127.              (subst (let-def-expr (let-defs e)) x f))
  128.            (if (eq? x (let-def-var (let-defs e)))
  129.                (let-expr e)
  130.                (subst (let-expr e) x f)))]
  131.         [(if-zero? e)
  132.          (if-zero-cons
  133.           (subst (if-zero-cond e) x f)
  134.           (subst (if-zero-then e) x f)
  135.           (subst (if-zero-else e) x f))]
  136.         [(var? e)
  137.          (if (eq? x (var-var e))
  138.              f
  139.              (var-var e))]))
  140.  
  141. (define (eval-subst e)
  142.   (cond [(const? e) e]
  143.         [(binop? e)
  144.          ((op->proc (binop-op e))
  145.             (eval-subst (binop-left  e))
  146.             (eval-subst (binop-right e)))]
  147.         [(op? e)
  148.          (apply
  149.           (op->proc (op-op e))
  150.           (map eval-subst (op-args e)))]
  151.         [(let? e)
  152.          (eval-subst
  153.            (subst
  154.              (let-expr e)
  155.              (let-def-var (let-defs e))
  156.              (eval-subst (let-def-expr (let-defs e)))))]
  157.         [(if-zero? e)
  158.          (if (= (eval-subst (if-zero-cond e)) 0)
  159.              (eval-subst (if-zero-then e))
  160.              (eval-subst (if-zero-else e)))]
  161.         [(var? e)
  162.          (error "undefined variable" (var-var e))]))
  163.  
  164. ;; evaluation via environments
  165.  
  166. (define empty-env
  167.   null)
  168.  
  169. (define (add-to-env x v env)
  170.   (cons (list x v) env))
  171.  
  172. (define (find-in-env x env)
  173.   (cond [(null? env) (error "undefined variable" x)]
  174.         [(eq? x (caar env)) (cadar env)]
  175.         [else (find-in-env x (cdr env))]))
  176.  
  177. (define (eval-env e env)
  178.   (cond [(const? e) e]
  179.         [(binop? e)
  180.          ((op->proc (binop-op e))
  181.             (eval-env (binop-left  e) env)
  182.             (eval-env (binop-right e) env))]
  183.         [(op? e)
  184.          (apply
  185.           (op->proc (op-op e))
  186.           (map (lambda (a) (eval-env a env))
  187.                (op-args e)))]
  188.         [(let? e)
  189.          (eval-env
  190.            (let-expr e)
  191.            (env-for-let-defs (let-defs e) env))]
  192.         [(if-zero? e)
  193.          (if (= (eval-env (if-zero-cond e) env) 0)
  194.              (eval-env (if-zero-then e) env)
  195.              (eval-env (if-zero-else e) env))]
  196.         [(var? e) (find-in-env (var-var e) env)]))
  197.  
  198. (define (env-for-let-defs defs env)
  199.   (if (null? defs)
  200.       env
  201.       (env-for-let-defs (cdr defs) (env-for-let (let-def defs) env))))
  202.  
  203. (define (env-for-let def env)
  204.   (add-to-env
  205.     (let-def-var def)
  206.     (eval-env (let-def-expr def) env)
  207.     env))
  208.  
  209. (define (eval e)
  210.   (eval-env e empty-env))
  211.  
  212.  
  213. ;; cwiczenia
  214.  
  215. ;; cw. 2
  216.  
  217. (define (stack? s) (list? s))
  218.  
  219. (define empty-stack null)
  220.  
  221. (define (push e s) (cons e s))
  222.  
  223. (define (pop s) (cons (car s) (cdr s)))
  224.  
  225. ;; cw. 1
  226.  
  227. (define (arith->rpn e)
  228.   (define (aux s e)
  229.     (cond [(const? e) (push e s)]
  230.           [(binop? e)
  231.            (let ((op (binop-op e))
  232.                  (l (binop-left e))
  233.                  (r (binop-right e)))
  234.              (aux (aux (push op s) r)
  235.                   l))]))
  236.   (aux empty-stack e))
  237.  
  238. ;; cw. 3
  239.  
  240. (define (eval-rpn e)
  241.   (define (aux e s)
  242.     (cond [(null? e) (car (pop s))]
  243.           [(const? (car e))
  244.            (aux (cdr e) (push (car e) s))]
  245.           [(symbol? (car e))
  246.            (aux (cdr e)
  247.                 (push                
  248.                  ((op->proc (car e))
  249.                   (car (pop (cdr (pop s))))
  250.                   (car (pop s)))
  251.                  (cdr (pop (cdr (pop s))))))]))
  252.   (aux e empty-stack))
  253.  
  254. ;; cw. 4
  255.  
  256. ; / 7 + 2 3
  257. ; calc let x 3 x lambda x + x 2
  258.  
  259. ;; cw. 5
  260.  
  261. ; ewaluacja if-zero w let-wyrażeniach
  262.  
  263. (define (if-zero? e)
  264.   (and (list? e)
  265.        (= (length e) 4)
  266.        (eq? (car e) 'if-zero)))
  267.  
  268. (define (if-zero-cons c t e)
  269.   (cons 'if-zero (list c t e)))
  270.  
  271. (define (if-zero-cond e) (second e))
  272.  
  273. (define (if-zero-then e) (third e))
  274.  
  275. (define (if-zero-else e) (fourth e))
  276.  
  277. ;; cw. 6
  278.  
  279. ; operacje arytmetyczne o dow. ilosci argumentow
  280.  
  281. (define (op? e)
  282.   (and (list? e)
  283.        (member (car e) '(+ - * /))))
  284.  
  285. (define (op-cons op args) (cons op args))
  286.  
  287. (define (op-op e) (car e))
  288.  
  289. (define (op-args e) (cdr e))
  290.  
  291. ;; cw. 7
  292.  
  293. ; zamiana składni i ewaluacji let-wyrażeń
  294. ; nie działa subst, eval-subst dla leta
  295.  
  296. ;; cw. 8
  297.  
  298. ; NOT IMPLEMENTED YET I TYLE
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement