qse/ase/cmd/awk/lisp/scmhelp.lsp
2008-03-21 03:49:53 +00:00

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))))