Advertisement
dgulczynski

Untitled

Apr 14th, 2018
379
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 1.33 KB | None | 0 0
  1. ;; the let-lift procedure
  2. (define (reverse xs)
  3.   (define (iter xs ys)
  4.     (if (null? xs) ys
  5.         (iter (cdr xs) (cons (car xs) ys))))
  6.   (iter xs null))
  7.  
  8. ;; wynik jako para (wyrazenie, licznik)
  9. (define (ret-cons expr counter)
  10.   (cons expr counter))
  11. (define ret-expr car)
  12. (define ret-counter cdr)
  13.          
  14. (define (eval-rec e env i)
  15.   (define (eval-list done rest env i)
  16.     (if (null? rest) (ret-cons (reverse done) i)
  17.         (let ((e (eval-rec (car rest) env i)))
  18.           (eval-list (cons (car e) done) (cdr rest) env (cdr e)))))
  19.   (cond [(const? e) (ret-cons e i)]
  20.         [(var? e) (ret-cons (find-in-env (var-var e) env) i)]
  21.         [(op? e) (let ((args(eval-list '() (op-args e) env i)))
  22.                    (ret-cons (cons (op-op e) (ret-expr args)) (cdr args)))]
  23.         [(let? e) (let* ((def-expr (eval-rec (let-def-expr (let-def e)) env i))
  24.                          (expr (eval-rec (let-expr e)
  25.                                          (add-to-env (let-def-var (let-def e)) (number->symbol (ret-counter def-expr)) env)
  26.                                          (+ 1 (ret-counter def-expr)))))
  27.                     (ret-cons (let-cons (let-def-cons (number->symbol (ret-counter def-expr)) (ret-expr def-expr))
  28.                                         (ret-expr expr))
  29.                               (ret-counter expr)))]))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement