我正在尝试评估一个列表,该列表包含一个宏函数中的变量,该宏函数在 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
但出现了同样的错误
最佳答案
我建议您尝试:
(MYVAR P 1
(MYVAR Q 2
((print (eval 'mylist)))))
在此之后你的输出应该是
(list P Q)
为什么这样做? 在 Scheme 中,代码是使用括号嵌套的。
所以,例如
(print (eval (list 1 2 3)))
Scheme 将尝试找到 1 的定义并将 2 和 3 作为参数传递。
鉴于
(print (eval '(list 1 2 3)))
将打印
(list 1 2 3)
简而言之,单引号就像一个转义字符。
关于macros - eval 宏未绑定(bind)变量(CHICKEN 方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54602955/