根据文档 eval
和 eval-syntax
的行为相同,除了 eval
enriches the input syntax .
如果top-level-form是一个语法对象,其基准不是编译形式,那么它的词汇信息在发送到评估处理程序之前会被丰富:
与eval类似,除了stx必须是语法对象,并且它的词汇上下文在传递给求值处理程序之前不会被丰富 .
我很难理解这意味着什么 . 我得到的印象是以某种方式涉及命名空间,但我无法想出一个示例程序,其中eval和eval-syntax的行为不同 . (当给出语法对象时 . )
那么 eval
和 eval-syntax
如何区别,或者至少可以给我一个示例程序,以显示它们的行为方式不同?
3 回答
这是一个示例交互,显示它们的行为不同:
这表明
namespace-syntax-introduce
在eval
情况下使用具有向量绑定的命名空间应用于语法对象stx
,这就是vector-map
应用程序成功的原因 .在
eval-syntax
情况下,语法对象没有vector-map
的词法信息,并且没有完成名称空间引入,因此导致错误 .请注意,您需要模块来显示此差异而不是语法对象的顶级定义,因为顶级绑定是特殊的 . 从
namespace-syntax-introduce
看到这一位:您可以在模块内部获得类似的行为:
这是Asumu答案底部的双重程序:
这里的关键字是"enrichen" . 文档说
eval
使用namespace-syntax-introduce
来丰富语法对象:这意味着一个示例是由一个语法对象stx给出的,该语法对象stx引用当前命名空间中的绑定,其中
eval
被调用,而这正是Asumu的例子所做的 .FWIW在这里是我对“丰富的顶级形式”如何运作的理解:
在这里查看更多:https://github.com/soegaard/meta/blob/master/expander/expander.rkt#L348