;; Abstract syntaks for Core Scheme (CS)
M ::= V Values
| (let (x M) M)
| (if0 M M M)
| (M M ... M)
| (O M ... M) Primitive Operations
V ::= c Constants
| x Variables
| (lambda x1 ... xn . M)
;; A-normalized CS
M ::= V (return)
| (let (x V) M) (bind)
| (if0 V M M) (branch)
| (V V1 ... Vn) (tail call)
| (let ((x (V V1 ... Vn))) M) (call)
| (O V1 ... Vn) (prim-op)
| (let ((x (O V1 ... Vn))) M) (prim-op)
V ::= c | x | (lambda x ... x . M) Values
;;; Translating from CoreScheme to A Normal Form (define (value? M) (or (number? M) (symbol? M) (abstraction? M))) (define (abstraction? M) (and (pair? M) (eq? (car M) 'lambda))) (define (prim-op? M) (member M '(+ - * /))) ;; Example ; > (normalize-term '(+ (+ 2 2) (let (x 1) (- x)))) ; (let (t1 (+ 2 2)) ; (let (x 1) ; (let (t2 (- x)) ; (+ t1 t2)))) (require (lib "match.ss")) (define (normalize-term M) (normalize M (lambda (M) M))) (define (normalize M k) (match M [`(lambda ,params ,body) (k `(lambda ,params ,(normalize-term body)))] [`(let (,x ,M1) ,M2) (normalize M1 (lambda (N1) `(let (,x ,N1) ,(normalize M2 k))))] [`(if0 ,M1 ,M2 ,M3) (normalize-name M1 (lambda (t) (k `(if0 ,t ,(normalize-term M2) ,(normalize-term M3)))))] [`(,Fn . ,M*) (if (prim-op? Fn) (normalize-name* M* (lambda (t*) (k `(,Fn . ,t*)))) (normalize-name Fn (lambda (t) (normalize-name* M* (lambda (t*) (k `(,t . ,t*)))))))] [V (k V)])) (define (normalize-name M k) (normalize M (lambda (N) (if (value? N) (k N) (let ([t (new-var)]) `(let (,t ,N) ,(k t))))))) (define (normalize-name* M* k) (if (null? M*) (k '()) (normalize-name (car M*) (lambda (t) (normalize-name* (cdr M*) (lambda (t*) (k `(,t . ,t*)))))))) (define new-var (let ([count 0]) (lambda () (set! count (+ 1 count)) (string->symbol (string-append "t" (number->string count))))))
| CookbookForm | |
|---|---|
| TopicType: | Pearl |
| ParentTopic: | Pearls? |
| Next Topic: | |