(load "record.ss") (load "1.ss") (define-record num (val)) (define-record varref (var)) (define-record lambda (formals body)) (define-record app (operator operands)) (define recordify (lambda (exp) (cond ((number? exp) (make-num exp)) ((symbol? exp) (make-varref exp)) ((atom? exp) (error 'recordify "illegal expression ~s" exp)) ((eq? (car exp) 'lambda) (make-lambda (cadr exp) (recordify (caddr exp)))) (else (make-app (recordify (car exp)) (map recordify (cdr exp))))))) (define listify (lambda (exp) (variant-case exp (num (val) val) (varref (var) var) (lambda (formals body) (list 'lambda formals (listify body))) (app (operator operands) (cons (listify operator) (map listify operands))) (else (error 'listify "illegeal representation ~s" exp))))) (define free-vars (lambda (exp) (variant-case exp (num (val) '()) (varref (var) (list var)) (lambda (formals body) (remove-all formals (free-vars body))) (app (operator operands) (append (free-vars operator) (append-all (map free-vars operands)))) (else (error 'free-vars "illegeal representation ~s" exp))))) (define convert (lambda (exp) (convert-h exp '()))) (define convert-h (lambda (exp env) (variant-case exp (num (val) val) (varref (var) (list ': (get-depth var env) (get-offset var env))) (lambda (formals body) `(lambda (,length formals) (convert-h body (cons formals env)))) (app (operator operands) (cons (convert-h operator env) (map (lambda (x) (convert-h x env)) operands))) (else (error 'convert "illegeal representation ~s" exp))))) (define subst (lambda (v e b) (variant-case b (num (val) b) (varref (var) (if (eq? v var) e b)) (lambda (formals body) (if (memq v formals) b (make-lambda formals (subst v e body)))) (app (operator operands) (make-app (subst v e operator) (map (lambda (x) (subst v e x)) operands))) (else (error 'convert "illegeal representation ~s" b)))))