问题标签 [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.
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我找到了它)。
c++ - C/C++ 中的静态作用域
在下面的代码中,2
打印出来。
如果我们在 C 中有静态作用域,会发生什么?为什么不1
打印?
在这种情况下打印2
不是动态范围,是吗?
我认为在静态作用域中,它应该采用最接近函数定义的 x。
c++ - 转换构造函数的隐式参数
tl; dr:有没有办法将当前范围的默认参数添加到 C++ 中的所有隐式构造函数?
我目前正在为 C++ 中的嵌入式语言设计一个接口。目标是使创建语法正确的表达式既类型安全又方便。现在,我认为学习像 boost::proto 这样的重量级实现会给开发带来太大的延迟,所以我尝试推出自己的实现。
这是一个小演示:
如您所见,由于 C++ 重载和隐式转换,嵌入表达式相当简单。
然而,我面临一个实际问题:在上面的示例中,所有数据都以 std::string 对象的形式分配。在实践中,我需要一些更复杂的东西(AST 节点),它们在堆上分配并由专用所有者管理(遗留代码,无法更改)。所以我必须传递一个独特的参数(说所有者)并将其用于分配。我不想在这里使用静态字段。
我正在搜索的是一种使用方式,每次使用构建器时都要求用户提供这样的所有者,但以一种方便的方式。像动态范围变量这样的东西会很棒。有没有办法在 C++ 中获得以下内容:
这可能吗?
编辑:我想澄清为什么我(直到现在)不考虑全局变量。所有者必须在某个时候由构建器的用户手动释放,因此我无法创建一个临时的。因此,用户可能会完全“忘记”所有者。为了避免这种情况,我正在寻找一种方法来通过类型检查器强制所有者在场。
javascript - 如何操作变量范围?
学习一些 TypeScript。试图使这段代码工作:
收到此错误:Uncaught TypeError: Cannot set property 'ocrText' of undefined
控制台日志确实显示了对象属性和值。
如何从“结果”对象中提取“文本”属性的本地值到全局范围?
javascript - 我们如何做动态范围以在 NodeJs 中实现事务跟踪?
我正在构建一个客户端和一个服务器端框架(NodeJs),我想在其中跟踪事务。我能够在客户端和服务器之间传递标头(transaction_id),但是,我希望能够自动设置 transaction_id。这意味着如果定义了标头,中间件应该能够在上下文中读取和设置事务 id,以便下游调用可以读取它。
构建包装器超出了问题的范围。我正在努力的是能够动态地创建一个范围并在那里存储值。
注意 – 我使用的是“严格”模式,它不允许在节点中进行动态范围。所以需要另一种方式。注意 – 我正在使用 Promises 进行客户端-服务器调用。
macros - 动态绑定和宏
考虑以下代码:
基本上有两个原因(我能想到),这导致了这段代码的失败:
1.sum
首先根据两个变量alpha
和对宏进行评估beta
,它们作为符号发送到宏中。因此,要在宏内部评估的代码是:
这是行不通的,因为我们不能添加两个符号。
2. 变量alpha
andbeta
是词法绑定的,因此宏的代码不能访问alpha
and的符号值beta
。
因此,重新定义sum
:
在这里,宏sum
将评估提供给它的符号的值。只有在符号范围内,它才能做到这一点。因此,为了做到这一点,我们可以进行alpha
动态beta
绑定。
此外,为了检查动态绑定是否有效,我们可以创建一个函数dynamic-checker
,定义如下:
最后,我们可以在 REPL 中评估这段代码:
这给了我们错误:
注意2
错误代码末尾的。这是由函数返回的dynamic-checker
,它添加alpha
和beta
,即使它们不是它的参数,这证明变量alpha
和beta
可以被 的成员动态访问let
。
因此,宏sum
现在应该可以工作了,因为之前发生的两个问题都得到了解决。
但这显然不是这种情况,我错过了一些东西。
任何帮助表示赞赏。
javascript - Kyle Simpson 的 YDKJS 中的动态范围和“this”
Kyle Simpson在他的(伟大的)系列书籍“你不知道 JS”中指出,动态范围和this
机制是“近亲”,他还说:
“这个
this
机制有点像动态范围。” (YDKJS,范围和闭包,附录 A)
this
是什么阻止他说简单明了的动态范围?
另外,在“ this & Object Prototypes ”一书中,也是 YDKJS 系列的一部分,据我所知,Kyle 在讨论如何this
工作时并没有提到一次动态范围,所以我有点惊讶他为什么决定不在类比中走得更远......有人知道为什么吗?谢谢
python - 获取对调用函数的命名空间的引用
Python 3中是否有一种通用方法来获取对调用函数的模块命名空间的引用?问题源于这样一个事实,即global
在函数中引用了定义函数的命名空间,但我想获得对命名空间的引用,就像在具有动态范围的语言中一样。
实际上,我想在交互式会话期间使用预定义值污染当前命名空间,类似于from module import *
但调用set_state()
.
from module import *
语法是不够的,因为我有几个配置可以像set_state(3)
. 我知道我可以locals()
作为参数传递给函数。不过,我认为存在更通用的解决方案。此外,答案不应仅限于当前用例。
scheme - 暂时覆盖Scheme let 块中的全局定义函数?
假设我有以下功能:
我想暂时g
用不同 f
的电话。例如,像这样:
我希望上面的代码评估为 7,但事实并非如此。相反,它的计算结果为 6,因为g
调用了.f
let
有没有一种方法可以做到这一点,而无需g
在 内部重新定义,并且无需内联in 中let
定义的整个主体?(在实践中,可能是一个非常庞大、复杂的函数)。g
let
g
scheme - 动态范围返回未定义的 var
下面的代码,在动态范围假设下,将返回错误。
我的答案是 0,因为:
我在这里想念什么?