JMP 使用全局命名空间作为任何新脚本的默认命名空间,指定“本地”命名空间的方法是 Names Default to Here(1) 命令。 我的问题是这样的,当我包含一个顶部名称默认为 Here(1) 的文件时,它将从子脚本中引入名称/变量。 但是,如果我定义
include("filepath/name.ext", << New Context, << NamesDefaultToHere) 它将保持命名空间分开.. 这背后的原因是什么? 似乎应该做同样的事情? 由于我使用的是 Include 语句,它是否假设我想从子脚本中吸收名称?
即使 NamesDefaultToHere(1) 在脚本 B 中,下面的设置也会返回 x = 10
脚本A
x = 5;
include("filepath/script_B.jsl");
show(x);脚本B
namesDefaultToHere(1);
x = 10;
虽然这个返回 x = 5,因为我在 include 语句中具有名称DefaultToHere
脚本A
x = 5;
include("filepath/script_B.jsl", << newContext, <<NAMESDEFAULTTOHERE></NAMESDEFAULTTOHERE>脚本B
namesDefaultToHere(1);
x = 10
@drewfoglia和@EvanMcCorkle在 2019 年 Tuscon 探索峰会上做了题为“提高效率和可重复性的基本脚本:少做多做 (2019-US-TUT-290)其中讨论了这个主题。
其中一张幻灯片 (22) 提供了有关 Names Default to Here 的误解,其中之一是每个 JSL 文件都有自己的 Here 上下文。 如果每个脚本单独运行,但当 JSL 文件 A 中包含 JSL 文件 B 时,B 共享 A 的 Here 上下文,则情况如此。
在第一个示例中,使用名称解析规则,JMP 在 Here 命名空间中找到 X 并显示值 10。
在第二个示例中,使用“新语境”正在创建一个运行脚本 B 的匿名命名空间。 在本例中,X 不是 Here 命名空间的一部分,因此显示在 Global 命名空间中找到的值。