我正在尝试评估一个宏函数中带有变量的列表,该宏函数在lambda中定义了一个变量,但其中的评估不能
(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)
简而言之,单引号就像一个转义字符。