【问题标题】:eval macro Unbound variable (CHICKEN Scheme)eval 宏未绑定变量(CHICKEN 方案)
【发布时间】:2019-07-03 07:37:58
【问题描述】:

我正在尝试在一个宏函数中评估一个包含变量的列表,该函数在 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 的本地环境。
  • 宏无关。如果你写(let ((P 1)(Q 2)) (print (eval mylist))),你也会遇到同样的问题。
  • 巴尔玛所说的。 eval 使用顶级环境,而 P 和 Q 存在于调用 eval 的词法上下文中。 Eval 只是一个过程,它无法访问调用它的词法上下文。

标签: macros scheme eval chicken-scheme


【解决方案1】:

我建议你试试:

(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)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2022-12-18
    • 1970-01-01
    • 2012-10-04
    • 2018-09-15
    相关资源
    最近更新 更多