Implement 5.42
This commit is contained in:
@@ -88,26 +88,37 @@
|
||||
`((assign ,target (const ,(text-of-quotation exp)))))))
|
||||
|
||||
(define (compile-variable exp ct-env target linkage)
|
||||
(end-with-linkage linkage
|
||||
(make-instruction-sequence '(env) (list target)
|
||||
`((assign ,target
|
||||
(op lookup-variable-value)
|
||||
(const ,exp)
|
||||
(reg env))))))
|
||||
(let ((adr (find-variable exp ct-env)))
|
||||
(if (eq? adr 'not-found)
|
||||
(end-with-linkage linkage
|
||||
(make-instruction-sequence '(env) (list target 'env)
|
||||
`((assign env (op get-global-environment) (reg env))
|
||||
(assign ,target
|
||||
(op lookup-variable-value)
|
||||
(const ,exp)
|
||||
(reg env)))))
|
||||
(end-with-linkage linkage
|
||||
(make-instruction-sequence '(env) (list target)
|
||||
`((assign ,target
|
||||
(op lexical-address-lookup)
|
||||
(const ,adr)
|
||||
(reg env))))))))
|
||||
|
||||
(define (compile-assignment exp ct-env target linkage)
|
||||
(let ((var (assignment-variable exp))
|
||||
(get-value-code
|
||||
(compile (assignment-value exp) 'val 'next)))
|
||||
(end-with-linkage linkage
|
||||
(preserving '(env)
|
||||
get-value-code
|
||||
(make-instruction-sequence '(env val) (list target)
|
||||
`((perform (op set-variable-value!)
|
||||
(const ,var)
|
||||
(reg val)
|
||||
(reg env))
|
||||
(assign ,target (const ok))))))))
|
||||
(let* ((var (assignment-variable exp))
|
||||
(get-value-code (compile (assignment-value exp) ct-env 'val 'next))
|
||||
(adr (find-variable var ct-env)))
|
||||
(if (eq? adr 'not-found)
|
||||
(error "var not found -- compile-assignment" var)
|
||||
(end-with-linkage linkage
|
||||
(preserving '(env)
|
||||
get-value-code
|
||||
(make-instruction-sequence '(env val) (list target)
|
||||
`((perform (op lexical-address-set!)
|
||||
(const ,adr) ;; (const ,var) before
|
||||
(reg val)
|
||||
(reg env))
|
||||
(assign ,target (const ok)))))))))
|
||||
|
||||
(define (compile-definition exp ct-env target linkage)
|
||||
(let ((var (definition-variable exp))
|
||||
|
||||
Reference in New Issue
Block a user