此問題與範圍類似於:In R6RS Scheme, is there a way to get the current environment for use with eval?,但我想進一步探討一下,並且詢問如何解決此類問題。在計劃中使用lambda中的let變量
我的問題進一步混淆了,在我的情況下,'(+ x y)
是一個任意的未評估lambda表達式。未評估,因爲它可能包含對變量的一部分的調用(因爲Scheme不相信程序將在包含那些變量的環境中被調用,當前變量不包含這些變量時,它會引發未定義的標識符錯誤) 。所以問題變成:我如何重構我的代碼,使得這個範圍噩夢不再是問題?我希望在調用lambda時仍然可以使用let中的環境變量。
我使用Pretty Big
的目的是在方案創建類。我的做法,到目前爲止是相當大的(沒有雙關語意),但看起來像:
(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)))))
我不確定你想要做什麼,你有一些示例代碼? –
@ ChrisJester-Young我想他想弄清楚一個方法,讓'(let((x 1))(eval'(* x 2)))''返回'2'。 –
@Maxwell完全正確 – JPatnode