我试着理解方案中的引用现象是如何工作的。特别是,我想了解一下什么时候绑定了引用术语的自由变量。
例如,当我写下
(define q 'a)
(define a 42)
(eval q)它返回42。因此,我推断绑定时间是在运行时。但是在这种情况下,为什么这段代码会失败?
(let ((q 'a))
(let ((a 42))
(eval q)
)
)并返回
unbound variable: a谁能给我解释一下引用术语的绑定时间模型是什么(例如,可以与MetaOCaml相媲美?(我不这么认为))以及定义和让之间的区别?
发布于 2016-05-04 01:35:22
Scheme有词法作用域规则,而不是动态绑定规则。
顶级define定义的行为就像在顶级词法环境中创建绑定一样。
第二个代码片段实际上创建了两个词法环境,一个嵌套在另一个中。因此,在绑定q的地方(而不是“何时”),a仍然是未绑定的。但真正的问题是,eval使用的是哪种环境?
您的实现的行为就好像它使用定义环境或顶级环境,但肯定不是当前的词法环境来计算symbol 'a,它是q变量的值。变量q有一个清晰的绑定词法环境,由它的let形式创建--但是symbol 'a的绑定驻留在哪里?我们如何知道?
详细信息应在文档中提供。
发布于 2016-05-04 01:43:53
首先,在像Javascript这样的C语法语言中,带引号的符号是与字符串具有相同字符序列的变量。他们没有任何共同之处,因为他们生活在不同的世界。
eval不知道词法变量,只知道全局变量。它知道要计算的结构中的词法变量。例如:
(eval '(let ((tmp (list q q)))
tmp)) q需要是全局的,但tmp是一个词法变量。
标准方案,又名R6RS,采取第二个参数,您可以选择哪些库应该是可用的。这些仍然被认为是全球性的。
变量在运行时绑定。只要这种优化不破坏报告,实现就可以自由地进行优化和常量折叠。
eval是一个强大的过程,除非它是解决问题的最明智的方法,否则永远不应该使用。在我17年的职业生涯中,我在产品代码中见过两次,我认为这一次太多了。
https://stackoverflow.com/questions/37009106
复制相似问题