【发布时间】:2019-07-03 07:37:58
【问题描述】:
我正在尝试在一个宏函数中评估一个包含变量的列表,该函数在 lambda 中定义了一个变量,但其中的 eval 不能
(define-syntax MYVAR
(syntax-rules ()
[(_ varname value body ...) ((lambda (varname) body ...) value)]))
(define mylist '(list P Q))
(print mylist)
(MYVAR P 1
(MYVAR Q 2
(print P Q) ;;everything prints fine in here
(print (eval mylist))))
<eval> ((lambda2127 (P) (MYVAR Q 2 (print P Q) (print (eval mylist)))) 1)
<eval> ((lambda2129 (Q) (print P Q) (print (eval mylist))) 2)
<eval> (print P Q)
<eval> (print (eval mylist))
<eval> (eval mylist)
<syntax> (list P Q)
<eval> (list P Q) <--
=> Error: unbound variable: P
我假设 eval 尝试在我的宏编译之前进行评估,但不确定,
有没有办法重用列表并在宏中对其进行评估?
我尝试使用define-for-syntax,但出现同样的错误
【问题讨论】:
-
由于您没有为
eval提供环境参数,因此它在顶级环境中进行评估,而不是绑定P和Q的本地环境。 -
宏无关。如果你写
(let ((P 1)(Q 2)) (print (eval mylist))),你也会遇到同样的问题。 -
巴尔玛所说的。 eval 使用顶级环境,而 P 和 Q 存在于调用 eval 的词法上下文中。 Eval 只是一个过程,它无法访问调用它的词法上下文。
标签: macros scheme eval chicken-scheme