Eval宏未绑定变量(CHICKEN Scheme)

3
我正在尝试在宏函数中评估一个包含变量的列表,并在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提供环境参数,它会在顶层环境中进行评估,而不是绑定PQ的本地环境。 - Barmar
1
宏并不相关。如果您编写了(let((P 1)(Q 2))(print(eval mylist))),您将遇到同样的问题。 - Barmar
Barmar所说的。Eval使用顶层环境,而P和Q存在于调用eval的词法上下文中。Eval只是一个过程,它没有访问调用它的词法上下文的权限。 - sjamaan
1个回答

0
我建议你尝试一下这个:
(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)

简而言之,单引号就像一个转义字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接