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

时间:2019-02-09 03:43:37

标签: macros scheme eval chicken-scheme

我正在尝试评估一个宏函数内部的变量列表,该宏函数在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,但出现相同的错误

1 个答案:

答案 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)

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