我正在尝试评估一个宏函数内部的变量列表,该宏函数在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
,但出现相同的错误
答案 0 :(得分:0)
我建议您尝试:
(MYVAR P 1
(MYVAR Q 2
((print (eval 'mylist)))))
此后,您的输出应为
(list P Q)
为什么要这样做? 在Scheme中,代码使用括号嵌套。
例如,
(print (eval (list 1 2 3)))
方案将尝试找到1的定义,并将2和3作为参数传递。
而
(print (eval '(list 1 2 3)))
将打印
(list 1 2 3)
简而言之,单引号就像一个转义字符。