进行更改后运行脚本。 如果不关闭并重新打开脚本就无法工作 - 为什么?我正在学习 JSL,并获得了一种我认为刚开始时没有获得的行为。 我想知道这种行为是否是预期的,或者是否是由于我无意中进行的设置更改而发生的。
我有一个简单的“主”脚本,它调用一个函数和另一个脚本。 当我重新打开 JMP 并重新运行主脚本或其调用的其他函数/脚本时,所有这些都运行良好并产生预期结果。 但是,当我对其中任何一个进行更改时(例如,如果我注释主脚本中包含的脚本,例如下面的最后一行),它们就不起作用。 如果我关闭所有打开的脚本然后重新启动它们,它们会再次工作。 来自其他编程语言,我不希望出现这种行为。 任何方向都非常感激
下面是我的主要脚本示例(我使用的是 JMP13)。
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");评论上面的最后一行(或者如果我取消注释清除日志())即
//clear log ();
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
//include ("generateJournal.jsl");在上面的脚本中给我以下错误
Name Unresolved: getDataTable4partID in access or evaluation of 'getDataTable4partID' , getDataTable4partID( "partID", "partIDname" ) /*###*/
关闭所有打开的脚本和函数(有时是 JMP)并再次启动它们似乎可以让一切再次正常运行。 不知道发生了什么......
任何方向都非常感激。
自动化和脚本编写回复:进行更改后运行脚本。 如果不关闭并重新打开脚本就无法工作 - 为什么?是的,getDataTable4partID 函数必须先由 JSL 解析,然后才能调用它。include 语句读入函数并将其加载到内存中。一旦进入内存,就可以调用。
回复:进行更改后运行脚本。 如果不关闭并重新打开脚本就无法工作 - 为什么?请原谅我的无知,但这就是你对我为什么需要使用的解释吗?
include ("getDataTable4partID.jsl");为了让我的函数调用工作?
回复:进行更改后运行脚本。 如果不关闭并重新打开脚本就无法工作 - 为什么?该函数需要在调用之前进行解析。JSL 解释器一次一行地逐步执行代码。如果在您尝试调用该函数之前它尚未单步执行该函数代码,JSL 将停止。对于 JSL 中的所有变量等也是如此。 因此:
Names Default to Here( 1 );
Clear Symbols();
print( a );
a = 42;
将会失败
Name Unresolved: a in access or evaluation of 'a' , a/*###*/
at line 3 in Script 4.jsl
尽管
Names Default to Here( 1 );
Clear Symbols();
a = 42;
print( a );
将运行而不会出现错误
回复:进行更改后运行脚本。 如果不关闭并重新打开脚本就无法工作 - 为什么?添加
include ("getDataTable4partID.jsl");在函数调用之前( getDataTable4partID.jsl 是函数脚本的名称)
getDataTable = getDataTable4partID("partID","partIDname"); IE
Names Default to Here( 1 );
Clear Symbols();
include (''getDataTable4partID.jsl");
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");似乎已经解决了所有问题。 是什么原因?
回复:进行更改后运行脚本。 如果不关闭并重新打开脚本就无法工作 - 为什么?@tx尼尔森
功能getDataTable4partID 已定义、保存并执行。 它按照之前的预期工作。
调用它的主脚本或主脚本中包含的其他脚本不再且无法工作。
回复:进行更改后运行脚本。 如果不关闭并重新打开脚本就无法工作 - 为什么?Names Default to Here( 1 );
Clear Symbols();
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");
我假设这是您代码的第一部分。 正确的?
代码中的第三行正在查找名为“getDataTable4partID”的函数。当代码尝试运行该行时,该函数尚未定义。您需要先执行函数定义,然后才能调用它。
回复:进行更改后运行脚本。 如果不关闭并重新打开脚本就无法工作 - 为什么?谢谢@tx尼尔森。 好的,这就是我所做的,现在即使在关闭并重新运行或重新启动 JMP 后,我的脚本和函数也无法工作。
我的主要脚本
Names Default to Here( 1 );
Clear Symbols();
getDataTable = getDataTable4partID("partID","partIDname");
include ("plotallcharts.jsl");
include ("generateJournal.jsl");我的功能是(没有数据库详细信息)
Names Default to Here (1)
getDataTable4PartID = Function({PartID}, {dtTemp},
dtTemp = Open Database("connectionstring",
"select '" || PartID || "' as value
from dual",
PartID
);
return(dtTemp);
);和我的剧本
plotallcharts.jsl;
也有它的拳头线
Names Default to Here (1)
我仍然收到错误
Name Unresolved: getDataTable4partID in access or evaluation of 'getDataTable4partID' , getDataTable4partID( "partID", "partIDname" ) /*###*/
但有时日志在运行主脚本时不会显示任何内容。
回复:进行更改后运行脚本。 如果不关闭并重新打开脚本就无法工作 - 为什么?你的整个脚本应该这样开始:
Names Default to Here( 1 );
Clear Symbols();
这将稳定命名空间环境并清除所有以前的值,从而使您每次从顶部运行代码时都能重新开始。
回复:进行更改后运行脚本。 如果不关闭并重新打开脚本就无法工作 - 为什么?谢谢@tx尼尔森。
这是函数
getDataTable4partID
你建议我使用
clear symbols();
// clear globals();
在我的主脚本的顶部?
如果是,那么我已经厌倦了它,但行为没有任何改变。
另外,我忘记在上面提到,当主脚本不运行(在对其进行更改后)并且我需要重新启动 JMP 以使脚本再次按预期运行时,我还需要运行我的主脚本正在调用的函数,一次,没有它我的主脚本就无法运行。 这显然是一种不受欢迎的行为,我担心我做得不对。
回复:进行更改后运行脚本。 如果不关闭并重新打开脚本就无法工作 - 为什么?在您的示例中,我看不到您定义该函数的位置
getDataTable4partID
JSL 是一种解释性语言,需要在调用代码之前创建代码中引用的任何项目。它不是一种编译语言,它首先通过所有代码和识别函数等。现在可能令人困惑的是,一旦定义了函数,它将保留在内存中并可用,直到用 a 清除它为止。
clear symbols();<BR />// or<BR />clear globals();
如果您牢记这一点来执行代码,您可能会明白为什么 JSL 找不到该函数。