问题标签 [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.
javascript - 奇怪的行为,如 Javascript 中的动态范围
我有以下测试代码:
使用 node.js 运行时的结果是
似乎当 namevariable_function
被解析时dynamic_scoped_function
,它取决于调用堆栈,但没有像我期望的那样静态解析到外部堆栈。
在我看来,这种行为是愚蠢的,因为我无法预见会在哪里dynamic_scoped_function
被调用。这种语言是否设计成这样?还是我只是误解了什么?
谢谢你的帮助。
lisp - 如何测试动态范围是否已在 lisp 中正确实现?
我有基于 JavaScript 中方案的简单 lisp 实现。默认情况下它具有词法范围,但我刚刚添加了动态范围作为选项。我如何测试我是否正确实现了这一点:
此代码打印 20 和 30:
所以值 y 是动态的,因为它为函数 foo 改变了我需要做些什么来使 lisp 动态化,或者是这样吗?
let 和函数调用是唯一可以观察动态范围的地方吗?
perl - 使用 Perl 的动态作用域时如何避免全局变量声明?
我正在尝试编写一个 perl 脚本,该脚本调用在其他地方(由其他人)编写的函数,该函数操纵我脚本范围内的一些变量。假设脚本是main.pl
并且函数在funcs.pm
. 我的main.pl
样子是这样的:
出于某种原因,使用local our $pointer;
会阻止$pointer
范围之外的可见性。但是,如果我只是使用our $pointer;
,则可以在main.pl
使用范围之外看到变量$plshelp::pointer
(但在中看不到funcs.pm
,所以无论如何它都没用)。作为旁注,有人可以解释一下吗?
funcs.pm
看起来像这样:
我希望这会在主脚本运行时更改$var
并打印的值。4
但是我得到一个编译错误,说$pointer
没有声明。可以通过在inour $pointer;
的顶部添加来删除此错误,但这会创建一个在任何地方都可见的不必要的全局变量。我们也可以通过删除 来删除这个错误,但这似乎是个坏主意。我们也可以通过使用in让它工作,但写作的人不想这样做。change
funcs.pm
use strict;
$plshelp::pointer
funcs.pm
funcs.pm
有没有一种好方法可以funcs.pm
在不声明全局变量的情况下实现在我的范围内操作变量的功能?如果我们无论如何都要使用全局变量,我想我根本不需要使用动态范围。
假设由于某种原因无法将参数传递给函数。
更新
local our
就防止可见性而言,似乎没有做任何“特殊”。从perldoc:
这意味着 when
use strict 'vars'
生效,our
允许您使用包变量而不用包名限定它,但只能在 our 声明的词法范围内。这立即适用——即使在同一个语句中。
和
即使之前没有使用过包变量,这也可以工作,因为包变量在第一次使用时就会出现。
所以这意味着$pointer
即使在我们离开花括号之后“存在”。只是我们必须使用$plshelp::pointer
而不是 just来引用它$pointer
。但是由于我们local
在初始化之前使用过$pointer
,它在范围之外仍然是未定义的(尽管它仍然是“声明的”,不管这意味着什么)。写这个的更清晰的方法是(local (our $pointer)) = \$var;
. 在这里,our $pointer
“声明”$pointer
并返回$pointer
。我们现在应用local
这个返回值,并且这个操作$pointer
再次返回我们分配给\$var
.
但这仍然留下了一个主要问题,即是否有一个很好的方法来实现所需的功能。
r - Dynamic scoping questions in R
I'm reading the AdvancedR by Hadley and am testing the following code on this URL
Then I got the following error message:
Error in eval(substitute(condition), df) : object 'a' not found
I read the explanation as follows but don't quite understand:
If eval() can’t find the variable inside the data frame (its second argument), it looks in the environment of subset2(). That’s obviously not what we want, so we need some way to tell eval() where to look if it can’t find the variables in the data frame.
In my opinion, while "eval(substitute(condition),df )", the variable they cannot find is condition, then why object "a" cannot be found?
On the other hand, why the following code won't make any error?
lisp - 带有蹦床和 Y 组合器的代码应该在具有动态范围的 lisp 中工作吗?
我在 javascript 中有类似于方案的 lisp。它可以与词法和动态范围一起使用。我不确定动态范围是如何工作的,它似乎没问题,但是当范围是动态时,这段代码不起作用:
当范围是词法时它工作正常。当范围是动态的时,此代码是否应该工作?现在它什么也不做,我不知道为什么,但想确保在我开始调试之前这段代码应该工作,并因此使我的动态范围中断。
我的带有演示的 lisp 在这里https://jcubic.github.io/lips/但是使它适用于词法范围的代码尚未发布,因此它不起作用。(它在 devel 分支中,我可以用它或使用 Stack Snippet 创建 codepen 演示)。
dynamic - 我不明白为什么使用动态挖掘以该顺序隐藏变量
使用(动态范围)
问题是:对于调用序列,说明在最后一个过程 Main 调用 Suba 的执行过程中哪些变量是可见的;Suba调用Subb;Subb 调用 Subc
为什么是答案: Suba:A,X,W Subb:B,Z Subc:Y
我试过解决它,我只是不明白这是怎么回事,谁能提供解释
scope - 如何编写不使用参数隐藏变量的 PicoLisp 函数
我在闲逛 PicoLisp,发现自己对如何编写传统上由宏处理的元编程函数(在其他 lisp 方言中)感到困惑。对我来说最大的担忧是我看不到如何防止变量名隐藏。回顾元编程 101中的示例,如果有的话,只会让我更加困惑。
有关如何实现该功能的示例mapeach
,如链接文章中所示:
我已经用 call 测试了每一个(let "Args" * (mapeach N (1 2 3) ("Args" N N)))
。正如预期的那样,PicoLisp 解释器(以 command 开头pil +
)遇到段错误并崩溃。我认为这是因为mapeach
's"Args"
阴影"Args"
在调用点定义。
我还尝试了他们的两种实现map@
(“更可爱”的替代方案mapeach
)。
我曾经(let "Args" * (map@ (1 2 3) ("Args" @ @)))
测试过这些实现中的每一个。奇怪的是,我第一次测试第一个实现时,不仅没有段错误,而且实际上产生了正确的结果(1 4 9)
。随后的每个测试都导致了段错误。为清楚起见,提示中的片段:
我相信通过调用(当时)未定义的函数以某种方式阻止了段错误mapeach
,我也尝试过(ooga booga)
,这同样阻止了段错误。如果我没有将定义与正确调用分开的错误调用,则总是会发生段错误。
这最终导致两个问题:
- 如何防止名称隐藏?显然,这些例子在这方面并不成功。
- 为什么对 map@ 的调用不会导致段错误?
angularjs - AngularJS 没有在 http post 成功更新动态范围变量
我正在尝试从数据库中获取数据并将其分配给具有函数的动态范围变量,但它不会在第一次尝试时将数据分配给动态变量。任何人都可以帮忙吗?
这是我的 dynamicScope 函数;
这是 postService 功能;
当我将 postService 称为
它打印来自 postService 的数据,但是当我想在上一行之后打印它时会出错,就像这里console.log($scope.userInfo[0].user_name);
说 $scope.userInfo 未定义。但它会在第二次尝试中获取先前的数据。提前致谢。
python - 有没有办法声明一个函数应该使用调用者的范围?
是否有类似于 C 宏的功能,可以让您以内联方式重用代码,而无需为那段代码创建单独的范围?
例如:
将打印 3,但我希望它打印 4。
我知道涉及类或全局字典等对象的解决方案,但是我正在寻找一个更原始的解决方案(例如函数装饰器),它只会让我在调用者的范围内进行更改。
非常感谢你
编辑:任何需要声明我将使用哪些变量或事先声明像 mutabale 对象这样的“命名空间”的解决方案都不是我正在寻找的解决方案。
我自己尝试过:
但是我遇到了一个严重的问题,即如何在不破坏程序可调试性的情况下注入代码strip_game
,因为我只想创建一个新的代码对象或使用 exec,两者都遇到了一些严重的问题。
主要编辑:
好的,所以我有一些接近工作解决方案的东西,但是我遇到了一个非常奇怪的问题:
现在这似乎可行,但是,我得到以下信息:
game
现在,当我反汇编函数时,我得到了以下非常奇怪的和之间的编译差异strip_game
:
在游戏中:
在脱衣舞游戏中:
为什么会出现这种差异?
bash - 在 Bash 中分配给父上下文中的变量
我想写一个类似于read
内置的函数,我将变量名作为参数传递,函数将其结果返回到名为的变量中。
我试着这样做:
foo
但是,上面有一个问题:如果我使用第一个参数var
or调用,上面的内容就不起作用result
,因为这样赋值就变成了内部定义的局部变量,foo
而不是它的调用者。实际上,这泄漏了foo
.
如果我使用 nameref 代替 ( local -n
),则运行foo var
会产生一条警告消息,而foo result
不会向调用者返回任何内容,因为该result
变量是在函数中分配的。而且我不能只是将变量重命名为不会冲突的东西,因为我实际上打算在这里执行递归,因此变量将不可避免地与自身发生冲突。Namerefs 根本无法解决我的问题。
我也不能使用子shell,因为这样对全局变量的任何修改都会丢失。
有没有办法分配给调用者上下文中定义的动态命名变量?
(换句话说,我正在寻找 Tcl 的 bash 等价物upvar
。)