问题标签 [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.

0 投票
1 回答
72 浏览

lisp - 你能解释一下这个 LISP 函数以及为什么会出现动态与词法作用域的问题吗?

在从 LISP 1 到 LISP 1.5阅读一些 lisp 历史时,我遇到了这个函数:

根据 McCarthy 的说法,“困难在于,当发生内部递归时,car[x] 想要的值是外部值,但实际上使用的是内部值。在现代术语中,需要词法作用域,并获得动态作用域。”

我无法完全弄清楚他所指的“外部价值”和“内部价值”是什么,我也看不出这个函数在使用动态范围评估时是如何行为不端的。我可以理解 lambda 是否有一些阴影“x”,但它是零参数的函数。

(实际上很难找到这个功能,因为它似乎从网页本身中丢失了。只有在浏览了 images.tex 文件之后:http: //www-formal.stanford.edu/jmc/history/lisp /images.tex我找到了它)。

0 投票
4 回答
1429 浏览

c++ - C/C++ 中的静态作用域

在下面的代码中,2打印出来。

如果我们在 C 中有静态作用域,会发生什么?为什么不1打印?

在这种情况下打印2不是动态范围,是吗?

我认为在静态作用域中,它应该采用最接近函数定义的 x。

0 投票
2 回答
85 浏览

c++ - 转换构造函数的隐式参数

tl; dr:有没有办法将当前范围的默认参数添加到 C++ 中的所有隐式构造函数?

我目前正在为 C++ 中的嵌入式语言设计一个接口。目标是使创建语法正确的表达式既类型安全又方便。现在,我认为学习像 boost::proto 这样的重量级实现会给开发带来太大的延迟,所以我尝试推出自己的实现。

这是一个小演示:

如您所见,由于 C++ 重载和隐式转换,嵌入表达式相当简单。

然而,我面临一个实际问题:在上面的示例中,所有数据都以 std::string 对象的形式分配。在实践中,我需要一些更复杂的东西(AST 节点),它们在堆上分配并由专用所有者管理(遗留代码,无法更改)。所以我必须传递一个独特的参数(说所有者)并将其用于分配。我不想在这里使用静态字段。

我正在搜索的是一种使用方式,每次使用构建器时都要求用户提供这样的所有者,但以一种方便的方式。像动态范围变量这样的东西会很棒。有没有办法在 C++ 中获得以下内容:

这可能吗?

编辑:我想澄清为什么我(直到现在)不考虑全局变量。所有者必须在某个时候由构建器的用户手动释放,因此我无法创建一个临时的。因此,用户可能会完全“忘记”所有者。为了避免这种情况,我正在寻找一种方法来通过类型检查器强制所有者在场。

0 投票
1 回答
57 浏览

javascript - 如何操作变量范围?

学习一些 TypeScript。试图使这段代码工作:

收到此错误:Uncaught TypeError: Cannot set property 'ocrText' of undefined

控制台日志确实显示了对象属性和值。

如何从“结果”对象中提取“文本”属性的本地值到全局范围?

0 投票
2 回答
251 浏览

javascript - 我们如何做动态范围以在 NodeJs 中实现事务跟踪?

我正在构建一个客户端和一个服务器端框架(NodeJs),我想在其中跟踪事务。我能够在客户端和服务器之间传递标头(transaction_id),但是,我希望能够自动设置 transaction_id。这意味着如果定义了标头,中间件应该能够在上下文中读取和设置事务 id,以便下游调用可以读取它。

构建包装器超出了问题的范围。我正在努力的是能够动态地创建一个范围并在那里存储值。

注意 – 我使用的是“严格”模式,它不允许在节点中进行动态范围。所以需要另一种方式。注意 – 我正在使用 Promises 进行客户端-服务器调用。

0 投票
2 回答
334 浏览

macros - 动态绑定和宏

考虑以下代码:

基本上有两个原因(我能想到),这导致了这段代码的失败:
1.sum首先根据两个变量alpha和对宏进行评估beta,它们作为符号发送到宏中。因此,要在宏内部评估的代码是:

这是行不通的,因为我们不能添加两个符号。
2. 变量alphaandbeta词法绑定的,因此宏的代码不能访问alphaand的符号值beta
因此,重新定义sum

在这里,宏sum将评估提供给它的符号的值。只有在符号范围内,它才能做到这一点。因此,为了做到这一点,我们可以进行alpha动态beta绑定。
此外,为了检查动态绑定是否有效,我们可以创建一个函数dynamic-checker,定义如下:

最后,我们可以在 REPL 中评估这段代码:

这给了我们错误:

注意2错误代码末尾的。这是由函数返回的dynamic-checker,它添加alphabeta,即使它们不是它的参数,这证明变量alphabeta可以被 的成员动态访问let
因此,宏sum现在应该可以工作了,因为之前发生的两个问题都得到了解决。
但这显然不是这种情况,我错过了一些东西。
任何帮助表示赞赏。

0 投票
2 回答
276 浏览

javascript - Kyle Simpson 的 YDKJS 中的动态范围和“this”

Kyle Simpson在他的(伟大的)系列书籍“你不知道 JS”中指出,动态范围和this机制是“近亲”,他还说:

“这个this机制有点像动态范围。” (YDKJS,范围和闭包附录 A

this 什么阻止他说简单明了的动态范围?

另外,在“ this & Object Prototypes ”一书中,也是 YDKJS 系列的一部分,据我所知,Kyle 在讨论如何this工作时并没有提到一次动态范围,所以我有点惊讶他为什么决定不在类比中走得更远......有人知道为什么吗?谢谢

0 投票
1 回答
1427 浏览

python - 获取对调用函数的命名空间的引用

Python 3中是否有一种通用方法来获取对调用函数的模块命名空间的引用?问题源于这样一个事实,即global在函数中引用了定义函数的命名空间,但我想获得对命名空间的引用,就像在具有动态范围的语言中一样。

实际上,我想在交互式会话期间使用预定义值污染当前命名空间,类似于from module import *但调用set_state().

from module import *语法是不够的,因为我有几个配置可以像set_state(3). 我知道我可以locals()作为参数传递给函数。不过,我认为存在更通用的解决方案。此外,答案不应仅限于当前用例。

0 投票
4 回答
341 浏览

scheme - 暂时覆盖Scheme let 块中的全局定义函数?

假设我有以下功能:

我想暂时g不同 f的电话。例如,像这样:

我希望上面的代码评估为 7,但事实并非如此。相反,它的计算结果为 6,因为g调用了.f let

有没有一种方法可以做到这一点,而无需g在 内部重新定义,并且无需内联in 中let定义的整个主体?(在实践中,可能是一个非常庞大、复杂的函数)。gletg

0 投票
2 回答
63 浏览

scheme - 动态范围返回未定义的 var

下面的代码,在动态范围假设下,将返回错误。

我的答案是 0,因为:

我在这里想念什么?