我正在尝试在宏函数中评估一个包含变量的列表,并在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
的本地环境。 - Barmar(let((P 1)(Q 2))(print(eval mylist)))
,您将遇到同样的问题。 - Barmar