这个问题的范围类似于:在 R6RS 方案中,有没有办法让当前环境与 eval 一起使用?但我想更进一步,问你如何补救这样的事情。
我的问题进一步令人困惑,因为在我的情况下'(+ x y)
是任意未评估的 lambda 语句。未评估,因为它可能包含对作为 let 一部分的变量的调用(并且由于 Scheme 不相信该过程将在包含这些变量的环境中调用,而当前的环境不包含这些变量,因此它会触发未定义的标识符错误) . 所以问题就变成了:我怎样才能重组我的代码,这样这个范围界定的噩梦就不再是问题了?每当调用 lambda 时,我仍然希望能够使用 let 中的环境变量。
我在用着Pretty Big
目的是在 Scheme 中创建类。到目前为止,我的方法相当大(没有双关语),但看起来像:
(define (dispatch msg methods args)
(if (null? methods) (display "Method signature not found.")
(let (
(m-name (caar methods))
(m-args (cadar methods))
(m-body (caddar methods)))
(if (and (eq? msg (caar methods)) (eq? (length args) (length (cadar methods))))
`(lambda ,m-args ,m-body)
(dispatch msg (cdr methods) args)))))
(define (build-lets c-def)
(let (
(i-vars (cadr c-def))
(meths (caddr c-def)))
(eval `(append ',i-vars (list (list 'methods '',meths))))))
(define (new c-def . args)
(apply (eval `(lambda ,(map cadr (cadr c-def))
(let* ,(build-lets c-def)
(lambda (msg . args)
(letrec ((meth (dispatch msg methods args)))
(apply meth args))))))
args))
其中 c-def 是形式的类 def(比如一个点)
'(();Name of parent
((yvalue y) (xvalue x)) ;Instance variables: (i-var constructor-arg)
((getx () xvalue) ;Methods, ((name args body) ...)
(setx (x) (set! xvalue x)))))