首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案中引用条款的自由变量的绑定时间

方案中引用条款的自由变量的绑定时间
EN

Stack Overflow用户
提问于 2016-05-04 00:07:53
回答 2查看 188关注 0票数 1

我试着理解方案中的引用现象是如何工作的。特别是,我想了解一下什么时候绑定了引用术语的自由变量。

例如,当我写下

代码语言:javascript
复制
(define q 'a)
(define a 42)
(eval q)

它返回42。因此,我推断绑定时间是在运行时。但是在这种情况下,为什么这段代码会失败?

代码语言:javascript
复制
(let ((q 'a))
  (let ((a 42))
    (eval q)
  )
)

并返回

代码语言:javascript
复制
unbound variable:  a

谁能给我解释一下引用术语的绑定时间模型是什么(例如,可以与MetaOCaml相媲美?(我不这么认为))以及定义和让之间的区别?

EN

回答 2

Stack Overflow用户

发布于 2016-05-04 01:35:22

Scheme有词法作用域规则,而不是动态绑定规则。

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

第二个代码片段实际上创建了两个词法环境,一个嵌套在另一个中。因此,在绑定q的地方(而不是“何时”),a仍然是未绑定的。但真正的问题是,eval使用的是哪种环境?

您的实现的行为就好像它使用定义环境或顶级环境,但肯定不是当前的词法环境来计算symbol 'a,它是q变量的值。变量q有一个清晰的绑定词法环境,由它的let形式创建--但是symbol 'a的绑定驻留在哪里?我们如何知道?

详细信息应在文档中提供。

票数 2
EN

Stack Overflow用户

发布于 2016-05-04 01:43:53

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

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

代码语言:javascript
复制
(eval '(let ((tmp (list q q))) 
          tmp)) 

q需要是全局的,但tmp是一个词法变量。

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37009106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档