问题标签 [dynamic-scope]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
emacs - Emacs 24 中变量作用域的新规则是什么?
Emacs 24 现在有词法范围的变量。当然,它还具有动态范围的变量。既然它两者都有,我对变量何时具有哪种范围感到很困惑。有一个lexical-binding
变量控制何时启用词法绑定,我想我读过一些关于defvar
现在声明一个动态范围变量的内容,但总的来说我很迷茫。Emacs 24 的新范围规则是否有很好的解释?或者换一种说法,当我查看为 Emacs 24 编写的 Emacs Lisp 代码中的一个变量时,我如何知道该变量正在使用什么范围?
javascript - 是否可以在不使用 eval 的情况下在 JavaScript 中实现动态范围?
JavaScript 具有词法作用域,这意味着从函数内访问的非局部变量在定义时解析为该函数的父级作用域中存在的变量。这与动态作用域形成对比,在动态作用域中,从函数内访问的非局部变量在调用时解析为该函数的调用作用域中存在的变量。
上面的程序在词法范围的语言中打印 1 然后 2,在动态范围的语言中打印 3 然后 1。由于 JavaScript 是词法范围的,它会先打印 1,然后再打印 2,如下所示:
尽管 JavaScript 不支持动态作用域,但我们可以使用eval
如下方式实现它:
我想知道是否存在另一种可能的方法来实现相同的结果而不诉诸eval
.
编辑:这是我试图在不使用的情况下实现的eval
:
我知道这不是一个很好的例子,但总体思路是使用动态范围来创建闭包。我认为这种模式有很大的潜力。
clojure - clojure 和 ^:dynamic
我试图理解动态变量和绑定函数,所以我尝试了这个(clojure 1.3):
很困惑,我尝试了这个更简单的代码:
两段代码有什么区别?为什么第二个例子有效,而第一个无效?
提示:我刚刚意识到以下工作(仍然不完全理解为什么):
scheme - 就 SICP 的评估环境模型而言,词法与动态范围
在SICP 的第 3.2.2 节中,执行以下代码
用这张图来解释。
每次应用函数时,都会创建一个新框架(由E1
through标记E4
),它表示符号和值之间的一组绑定。当符号未绑定在框架中时,将查询该框架的封闭环境以获取该特定符号的绑定。
该图的有趣之处在于,所有标记为 的帧E
都包含在全局环境中。文中解释说这是因为函数是在全局环境中定义的,但没有详细说明这个问题:
请注意,由 所创建的每个帧都
square
指向全局环境,因为这是square
过程对象所指示的环境。
相反,如果框架包含在调用函数的环境中,比如E3
包含在E2
其中,又包含在 中E1
,那么这是否是动态范围语言如何工作的有效模型?此外,图中的框架是否具有相同的“父”环境,因为 Scheme 是词法范围的?
clojure - Clojure 动态绑定
我意识到以下是一个坏主意,原因有很多。我还意识到,鉴于我的 stackoverflow 代表为 23,因此很自然地假设我是一个学习编程的新手。但是,请幽默我,并专注于“我们如何做到这一点”而不是“你为什么要这样做/你不想这样做”方面。
我想要的是:
输出:
所以基本上,我希望with-animal成为一个宏,所有出现的“speak”函数调用都映射到我正在调用块的对象。
特别是,我不想写:
相反,我希望 with-animal 将speak函数映射到我正在调用的对象的某个方法。
在 Clojure 中有没有一种干净的方法可以做到这一点?
谢谢!
clojure - clojure 的动态变量和绑定的实际目的是什么?
我看了一下参考资料:http ://clojure.org/vars#Vars%20and%20the%20Global%20Environment,http : //clojuredocs.org/clojure_core/clojure.core/binding
以及clojure 和 ^:dynamic和Clojure 动态绑定
我仍然不明白为什么需要,binding
因为我编写的每个程序都没有它们,我可以找到以传统方式编写示例的方法——我觉得这更容易理解。有没有利用这个的项目/编程范例的例子?
例如......在动物说话的例子中,你可以得到类似的效果:
没有宏,没有动态绑定......仍然很干净。
c - 使用动态范围按名称调用
我在静态/动态范围内遇到以下问题:
下面的程序片段是用允许全局变量但不允许函数嵌套声明的编程语言编写的。
Q1。如果编程语言使用静态作用域和按需参数传递机制调用,上述程序打印的值是
(A) 115, 220 (B) 25, 220 (C) 25, 15 (D) 115, 105
Q2。如果编程语言使用动态作用域和按名称调用参数传递机制,则上述程序打印的值是
(A) 115, 220 (B) 25, 220 (C) 25, 15 (D) 115, 105
我的想法:
在 Q1:因为它是静态范围,并且根据需要调用,x 应该替换为 i + j。但这会导致本地名称冲突,因为已经有一个名为 i 的变量。所以它(全局 i)可能会被重命名,让我们说 i1,然后调用将是:
关于 Q2:在动态作用域中,您首先在本地函数中搜索变量,然后在调用本地函数的函数中搜索,然后在调用该函数的函数中搜索,依此类推,直到调用堆栈。
根据名称调用:
第二个电话将是
这个答案正确吗?(选项中不存在)我缺少什么吗?(可能是动态绑定?)
javascript - Eval 真的为 JavaScript 引入了动态作用域吗?
人们说Eval 为 JavaScript 带来了动态范围,但我看不出这种说法是如何有效的。使用 Eval 使用与调用环境相同的词法环境/变量环境来评估表达式(参考ECMA 262 v. 5)。表达式的赋值或声明显然是动态的,但我认为说它引入了动态范围是不合理的。
我是否正确地说 Eval 没有引入动态范围?