Binding Scheme中引用术语自由变量的绑定时间

Binding Scheme中引用术语自由变量的绑定时间,binding,scheme,eval,quote,free-variable,Binding,Scheme,Eval,Quote,Free Variable,我试图了解Scheme中的报价现象是如何工作的。特别是,我想了解引用术语的无约束变量是什么时候 例如,当我写作的时候 (define q 'a) (define a 42) (eval q) 它返回42。因此,我推断绑定时间是在运行时。但在这种情况下,为什么代码会失败 (let ((q 'a)) (let ((a 42)) (eval q) ) ) 返回 unbound variable: a 有人能给我解释一下引用术语的绑定时间模型是什么(例如,is可与MetaOCam

我试图了解Scheme中的报价现象是如何工作的。特别是,我想了解引用术语的无约束变量是什么时候

例如,当我写作的时候

(define q 'a)
(define a 42)
(eval q)
它返回42。因此,我推断绑定时间是在运行时。但在这种情况下,为什么代码会失败

(let ((q 'a))
  (let ((a 42))
    (eval q)
  )
)
返回

unbound variable:  a

有人能给我解释一下引用术语的绑定时间模型是什么(例如,is可与MetaOCaml相比?(我不这么认为))以及define和let之间的区别吗?

Scheme有词汇范围规则,而不是动态绑定规则

顶级
define
定义的行为就像在顶级词汇环境中创建绑定一样

第二个代码段实际上创建了两个词汇环境,一个嵌套在另一个中。因此,如果(不是“当”)
q
已绑定,
a
仍处于未绑定状态。但真正的问题是,
eval
使用哪个环境

您的实现的行为就像它使用定义环境或顶级环境(但肯定不是当前词汇环境)来计算符号
'a
,它是
q
变量的值。变量
q
有一个清晰的绑定词汇环境,由其
let
形式创建——但是符号
'a
的绑定驻留在哪里?我们怎么知道


详细信息应在文档中。

首先,在C语法语言(如Javascript)中,带引号的符号与具有相同字符序列的字符串一样是变量。因为他们生活在不同的世界,所以他们没有共同之处

eval
不知道词法变量,只知道全局变量。它知道要计算的结构中的词汇变量。例如

(eval '(let ((tmp (list q q))) 
          tmp)) 
q
需要是全局变量,但
tmp
是一个词汇变量

标准方案,也称为R6RS,采用第二个参数,您可以选择应该提供哪些库。这些仍然被认为是全球性的

变量在运行时绑定。只要这种优化不会破坏报告,实现就可以自由优化和不断折叠

eval
是一个功能强大的过程,除非它是解决问题的最明智的方法,否则永远不要使用它。在我17年的职业生涯中,我在生产代码中见过两次,我觉得这太过分了

什么实施?“键入”在哪里--在REPL,在文件中?