问题标签 [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.
design-patterns - lisp:动态范围与显式参数传递
我在(常见的)lisp 中看到了两种不同的“输出”函数模式:
使用动态范围是否像implicit
被认为是不好的做法,或者这是一种普遍接受的动态范围使用?请注意,我假设这是为了例如 DSL 来构建复杂的输出,如 HTML、SVG、Latex 或其他任何东西,并且除了生成打印表示之外不会做任何不同的事情。
除了风格之外,是否存在任何重要的差异,例如在性能、并发性或其他方面?
r - 将模型参数稳健地传递给 R 的 predict() 函数
我正在尝试使用 R 来拟合线性模型并进行预测。我的模型包括一些不在数据框中的常量边参数。这是我正在做的简化版本:
不幸的是,模型对象现在遇到了一个危险的范围问题:lm()
不保存b
为的一部分mdl
,所以当predict()
被调用时,它必须回到b
定义的环境中。因此,如果后续代码改变 的值b
,预测值也会改变:
如何强制predict()
使用原始b
值而不是更改后的值?或者,是否有某种方法可以控制predict()
变量的查找位置,以便我可以确保它获得所需的值?实际上,我不能将b
其作为newdata
数据框的一部分包含在内,因为在我的应用程序中,b
它是一个参数向量,其大小与新观察的数据框的大小不同。
请注意,相对于我的实际用例,我已经大大简化了这一点,所以我需要一个强大的通用解决方案,而不仅仅是临时黑客。
raku - 如何测试动态变量的存在?
据我了解,动态变量是在运行时查找的。我想用它们来启用类似于球拍参数的参数化。
为此,我必须设置一个可以覆盖但不一定可以更改的默认值。我目前的方法相当简单:
效果很好 - 除了它在外部范围上引入了参数的名称。my $*param = 15;
除了感觉不整洁之外,如果在文件级别使用,它还会产生会导致混乱的副作用。
我想做的是检查参数是否已在调用堆栈上定义,如下所示:
那么,是否可以执行这样的检查,如果可以,它是如何完成的?
loops - 循环宏中的常见 Lisp 绑定
我想在循环内重新绑定一个特殊变量。现在,通常,这是使用let
.
但是由于loop
宏有这些很好的with
子句,我想我可以在那里这样做。该表达式(macroexpand '(loop with *read-eval* = nil))
最终将绑定扩展到 a let
,因此它肯定会专门用于我的实现。但我在标准中找不到任何表明这是标准化行为的内容。所以,我想,我的问题是:
修改现有变量是否需要符合要求的实现*read-eval*
,或者是否存在创建同名新词法变量的风险?
scope - 静态作用域和动态作用域的区别
我的老师提供了以下伪代码,并说使用静态范围的输出是1 2 3
,但使用动态范围的输出是2 3 4
。
挑战在于静态作用域我们使用a=1, b=2, c=3 不注意main or no,使用a=1, b=2, c=4?仅在静态范围内,不包括 C 规则。
language-features - 何时发生词法范围绑定 - 在运行时或编译时?
C 语言在编译时采用范围绑定(变量引用获得固定地址 - 根本不改变),即静态范围的示例。
Elisp 语言在运行时进行范围绑定(变量指向自己的个人参考堆栈的顶部,let
// defun
... 特殊形式在离开时从顶部添加到堆栈顶部 - 那时捕获已修改),即示例的动态范围。
词法作用域中使用什么类型的绑定?
Common Lisp、Python、R、JavaScript 等语言声明它们实现了词法作用域。
这些语言的实现中使用了哪些技术?
我听说带有功能外观的环境。如果我是对的 - 环境是什么时候创建的?
是否可以或通常由开发人员手动构建和绑定环境以发挥作用?就像是call( bind_env(make_env({buf: [...], len: 5}), myfunc) )
scope - 为什么默认情况下 SAS 宏变量不是本地范围的?
在尝试解决与宏变量范围相关的问题时,我发现这个非常有用的 SO 页面。 为什么 %let 不创建局部宏变量?
因此,总结一下,编写%let x = [];
或%do x = [] %to [];
在宏中将:
- 如果全局符号表中已经没有“x”,则创建一个局部范围的宏变量 x,或者
- 如果“x”在全局符号表中,则更新全局范围宏变量“x”
这让我觉得非常不直观。由于这种设计选择,我愿意打赌 SAS 荒野中存在大量错误。我很少在宏中看到 %local 语句,即使是在使用常见变量名(如“i”或“counter”)的循环语句之上。例如,我刚刚从 SUGI 和 SAS 全球论坛论文 http://www.lexjansen.com/cgi-bin/xsl_transform.php?x=sgf2015&c =杉
事实上,我在我打开的第一篇 SAS 会议论文中发现了这段代码:
http://support.sas.com/resources/papers/proceedings15/1340-2015.pdf
任何调用 %flag 并且也有自己的 &j 变量的人都有祸了。他们很容易以没有日志错误但错误的结果结束,因为在他们调用 %flag 之后,他们的 &j 到处都是 4,这将是(根据经验)一个没有乐趣追踪的错误。或者更糟糕的是,他们可能永远不会意识到他们的结果是虚假的。
所以我的问题是,为什么不默认所有宏变量都是本地范围的决定?SAS 宏变量范围的工作方式是否有充分的理由?
arrays - 在angularjs中获取动态范围数组变量值
我有一个范围数组变量,我试图动态访问它。它的值已经设置好了。
就像这样。
当我尝试如下动态访问它时,我得到了未定义。
但是我可以使用以下内容直接访问它。
动态获取范围变量值的方式对其他人来说很好,但当变量名包含方括号时失败,即[]。
我遵循了这个示例,但对于包含数组或方括号 [ ] 的范围变量没有成功。
使用 $parse 服务动态设置范围数组变量也可以正常工作,如下所示。
raku - 为什么 temp 在 Perl 6 核心设置中不起作用?
我正在查看并在indir
实现中看到此评论:
我认为这种用法my
很奇怪,这导致了doc issue #1082对 ifmy
实际上是词法的问题感到厌烦。我原以为这temp
更适合用户级对动态变量的临时更改。
但是现在,我看到了这个评论,但我不太确定它是什么意思。temp
破的这么深?在这里不可用吗?还是评论是错误的?
如果评论是正确的,那么这种处理动态变量的方式是否会泄露到日常程序员级别,因为这是某些人不得不做的事情(他们已经习惯了?)
而且,这个级别到底有多低?似乎所有 Perl 6 都应该在这里可用。
scope - 以下代码在不同范围和调用约定中的输出是什么?
int a = 2;
void f(int b){
b = b*a;
a = a-b;
}
void main(){
int a = 10;
f(a);
print a;
}
a) 按值调用和词法作用域
b) 按值调用和动态作用域
c) 按引用调用和词法作用域
d) 按引用调用和动态作用域
我的回答:
a) 10
b) 10
c) 20
d) 100
如果我做错了什么,请建议我?