正在加载图片...
6.001 Lazy Metacircular Evaluator Re (define (make-procedure parameters body env) (list 'procedure parameters body env)) (define (compound-procedure? exp) (tagged-list? exp ' procedure)) (define (procedure-parameters p)(list-ref p 1)) (define (procedure-body p)(list-ref p 2)) (define (procedure-environment p)(list-ref p 3)) Representing environments ;; Implement environments as a list of frames; parent environment is the cdr of the list. Each frame will be implemented as a list ;; of variables and a list of corresponding values (define (enclosing-environment env)(cdr env)) (define (first-frame env) (car env)) (define the-empty-environment 'O) (define(make-frame variables values)(cons variables values)) (define (frame-variables frame)(car frame)) (define (frame-values frame)(cdr frame)) (define (add-binding-to-frame! var val frame) (set-car! frame (cons var (car frame))) (set-cdr! frame (cons val (cdr frame)))) (define (extend-environment vars vals base-env) (if (=(length vars)(l (cons (make-frame vars vals) base-env) (if ( (length vars)(length vals)) (error "Too many supplied"vars vals) (error "Too few args supplied"vars vals)))) (define (lookup-variable-value var env) (define (env-loop env) (define vars vals) (cond((null? vars)(env-loop (enclosing-environment env))) ((eq? var (car vars))(car vals)) (else (scan (cdr vars)(cdr vals))))) (if (eq? env the-empty-environment) Error "Unbound variabl LOOKUP" var) let ((frame (first-frame env))) (scan (frame-variables frame)(frame-values frame)))) Ce (define (set-variable-value! var val env) (define (env-le6.001 Lazy Metacircular Evaluator 4 Representing procedures (define (make-procedure parameters body env) (list ’procedure parameters body env)) (define (compound-procedure? exp) (tagged-list? exp ’procedure)) (define (procedure-parameters p) (list-ref p 1)) (define (procedure-body p) (list-ref p 2)) (define (procedure-environment p) (list-ref p 3)) Representing environments ;; Implement environments as a list of frames; parent environment is ;; the cdr of the list. Each frame will be implemented as a list ;; of variables and a list of corresponding values. (define (enclosing-environment env) (cdr env)) (define (first-frame env) (car env)) (define the-empty-environment ’()) (define (make-frame variables values) (cons variables values)) (define (frame-variables frame) (car frame)) (define (frame-values frame) (cdr frame)) (define (add-binding-to-frame! var val frame) (set-car! frame (cons var (car frame))) (set-cdr! frame (cons val (cdr frame)))) (define (extend-environment vars vals base-env) (if (= (length vars) (length vals)) (cons (make-frame vars vals) base-env) (if (< (length vars) (length vals)) (error "Too many args supplied" vars vals) (error "Too few args supplied" vars vals)))) (define (lookup-variable-value var env) (define (env-loop env) (define (scan vars vals) (cond ((null? vars) (env-loop (enclosing-environment env))) ((eq? var (car vars)) (car vals)) (else (scan (cdr vars) (cdr vals))))) (if (eq? env the-empty-environment) (error "Unbound variable -- LOOKUP" var) (let ((frame (first-frame env))) (scan (frame-variables frame) (frame-values frame))))) (env-loop env)) (define (set-variable-value! var val env) (define (env-loop env)
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有