Advertisement
Guest User

Untitled

a guest
Jul 18th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 4.77 KB | None | 0 0
  1. (define (print . objs) (for-each display objs) (newline))
  2.  
  3. (define (make-rw-env parent-store)
  4.   (define *store* parent-store)
  5.   (lambda (msg . args)
  6.     (case msg
  7.       ((names)    (map car *store*))
  8.       ((extend)   (make-rw-env *store*))
  9.       ((enter)    (let* ((n (car args))
  10.                          (v (cadr args)))
  11.                     (set! *store* (cons (cons n v)
  12.                                        *store*))))
  13.       ((lookup)   (let* ((n (car args))
  14.                          (v (assq n *store*)))
  15.                     (if v
  16.                         (cdr v)
  17.                         n))))));'not-defined))))))
  18.  
  19. (define (make-var-intr)
  20.   (let ((*backing* (make-rw-env '())))
  21.     (lambda (msg . args)
  22.       (case msg
  23.         ((enter) (*backing* 'enter (car args) 'void))
  24.         (else    (apply *backing* (cons msg args)))))))
  25.  
  26. (define (digger)
  27.   (define *max-v* -1)
  28.   (define (next-v)
  29.     (set! *max-v* (+ 1 *max-v*))
  30.     (string->symbol (string-append "v" (number->string *max-v*))))
  31.  
  32.   (define (dig sexp rw-env var-intr)
  33.     (if (not (pair? sexp))
  34.         (cond
  35.           ((symbol? sexp) (dig-identifier sexp rw-env var-intr))
  36.           (else           sexp))
  37.         (case (car sexp)
  38.           ((lambda) (dig-lambda sexp rw-env var-intr))
  39.           ((let)    (dig-let sexp rw-env var-intr))
  40.           (else     (dig-invocation sexp rw-env var-intr)))))
  41.  
  42.   (define (dig-identifier sexp rw-env var-intr)
  43.     (rw-env 'lookup sexp))
  44.  
  45.   (define (dig-lambda sexp rw-env var-intr)
  46.     (let ((param-names   (cadr sexp))
  47.           (proc-rw-env   (rw-env 'extend))
  48.           (body          (cddr sexp))
  49.           (proc-var-intr (make-var-intr)))
  50.  
  51.       (for-each (lambda (n) (proc-rw-env 'enter n (next-v))) param-names) ; GENERALIZE!
  52.  
  53.       (let ((rewritten-body (map (lambda (s)
  54.                                    (dig s proc-rw-env proc-var-intr))
  55.                                  body)))
  56.        `(lambda
  57.           ,(map (lambda (n) (dig-identifier n proc-rw-env  var-intr)) param-names) ;UGLY!
  58.             (letrec ,(map (lambda (n) `(,n 'void)) (proc-var-intr 'names))
  59.               ,@rewritten-body)))))
  60.  
  61.   (define (dig-let sexp rw-env var-intr)
  62.     (let* ((let-rw-env   (rw-env 'extend))
  63.            (var-names    (map car (cadr sexp)))
  64.            (rw-var-names (map (lambda (ignore) (next-v)) var-names))
  65.            (var-vals     (map cadr (cadr sexp)))
  66.            (body         (cddr sexp)))
  67.  
  68.       (for-each (lambda (n rwv)
  69.                   (let-rw-env 'enter n rwv)
  70.                   (var-intr 'enter rwv))
  71.                 var-names
  72.                 rw-var-names)
  73.  
  74.       (let* ((rewritten-vals  (map (lambda (s) (dig s rw-env var-intr))
  75.                                    var-vals))
  76.              (set!-statements (map (lambda (n v) (list 'set! n v))
  77.                                    rw-var-names
  78.                                    rewritten-vals))
  79.              (rewritten-body  (map (lambda (s) (dig s let-rw-env var-intr))
  80.                                    body)))
  81.        `(begin
  82.           ,@set!-statements
  83.           ,@rewritten-body))))
  84.                
  85.   (define (dig-invocation sexp rw-env var-intr)
  86.     (map (lambda (s) (dig s rw-env var-intr)) sexp))
  87.  
  88.   (lambda (q)
  89.     (let ((qo (dig q (make-rw-env '()) 'no-var-intr)))
  90.       (print "in:  " q)
  91.       (print "out: " qo)
  92.       (print "res-eval-in:  " (eval q (scheme-report-environment 5)))
  93.       (print "res-eval-out: " (eval qo (scheme-report-environment 5))))))
  94.  
  95. ((digger) (quote
  96.  
  97. ((lambda (a b c)
  98.   (let ((d (* a b c)))
  99.     (let ((a (let ((a (+ a 111))) (+ a 9)))
  100.           (b (let ((a 3)
  101.                    (b (* a 222))
  102.                    (k (+ a b c)))
  103.                (+ a b k))))
  104.       (+ a b (let ((d 222)) d) (* c d))))) 99 3 4)
  105.  
  106. ))
  107.  
  108.  
  109. ;;; RESULTS
  110.  
  111. ; in  
  112. ((lambda (a b c)
  113.   (let ((d (* a b c)))
  114.     (let ((a (let ((a (+ a 111))) (+ a 9)))
  115.           (b (let ((a 3)
  116.                    (b (* a 222))
  117.                    (k (+ a b c)))
  118.                (+ a b k))))
  119.       (+ a b (let ((d 222)) d) (* c d))))) 99 3 4)
  120.  
  121. ; out
  122. ((lambda (v0 v1 v2)
  123.    (letrec ((v10 (quote void))
  124.             (v9  (quote void))
  125.             (v8  (quote void))
  126.             (v7  (quote void))
  127.             (v6  (quote void))
  128.             (v5  (quote void))
  129.             (v4  (quote void))
  130.             (v3  (quote void)))
  131.      (begin
  132.        (set! v3 (* v0 v1 v2))
  133.        (begin
  134.          (set! v4 (begin
  135.                     (set! v6 (+ v0 111))
  136.                     (+ v6 9)))
  137.          (set! v5 (begin
  138.                     (set! v7 3)
  139.                     (set! v8 (* v0 222))
  140.                     (set! v9 (+ v0 v1 v2))
  141.                     (+ v7 v8 v9)))
  142.          (+ v4 v5 (begin (set! v10 222) v10) (* v2 v3)))))) 99 3 4)
  143.  
  144. ; res-eval-in
  145. 27280
  146.  
  147. ; res-eval-out
  148. 27280
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement