评估宏 未绑定变量(CHICKEN 方案)



我正在尝试评估一个宏函数中带有变量的列表,该宏函数在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)

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

最新更新