49 lines
1.3 KiB
Plaintext
49 lines
1.3 KiB
Plaintext
|
; Stuff common to scheme.lsp and tail.lsp.
|
||
|
|
||
|
; Environment operations
|
||
|
|
||
|
(define extend-env
|
||
|
(lambda (vars vals env)
|
||
|
(cons (cons vars vals) env)))
|
||
|
|
||
|
(define lookup-variable
|
||
|
(lambda (var env)
|
||
|
(if (null? env)
|
||
|
(eval var) ; to give access to Lisp primitives and constants
|
||
|
(lookup-in-frame var (caar env) (cdar env) (cdr env)))))
|
||
|
|
||
|
(define lookup-in-frame
|
||
|
(lambda (var vars vals enclosing-env)
|
||
|
(if (null? vars)
|
||
|
(lookup-variable var enclosing-env)
|
||
|
(if (eq? (car vars) var)
|
||
|
(car vals)
|
||
|
(lookup-in-frame var (cdr vars) (cdr vals) enclosing-env)))))
|
||
|
|
||
|
(define define-variable-value
|
||
|
(lambda (var value env)
|
||
|
(let ((frame (car env)))
|
||
|
(set-car! frame (cons var (car frame)))
|
||
|
(set-cdr! frame (cons value (cdr frame))))))
|
||
|
|
||
|
; Syntax
|
||
|
|
||
|
(define cadar (lambda (lst) (cadr (car lst))))
|
||
|
(define cdddr (lambda (lst) (cddr (cdr lst))))
|
||
|
(define caddar (lambda (lst) (cadr (cdr (car lst)))))
|
||
|
|
||
|
(define test-exp cadr)
|
||
|
(define then-exp caddr)
|
||
|
(define else-exp (lambda (exp) (if (cdddr exp) (cadddr exp) nil)))
|
||
|
|
||
|
(define make-closure cons)
|
||
|
(define closure-formals cadar)
|
||
|
(define closure-body caddar)
|
||
|
(define closure-env cdr)
|
||
|
|
||
|
(define primitive?
|
||
|
(lambda (object)
|
||
|
(and (pair? object)
|
||
|
(eq? (car object) '%prim))))
|
||
|
|