進行更改後運行腳本。 如果不關閉並重新打開腳本就無法工作 - 為什麼?我正在學習 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 是一種解釋性語言,需要在調用代碼之前創建代碼中引用的任何項目。它不是一種編譯語言,它首先通過所有代碼和識別函數等。現在可能令人困惑的是,一旦定義了函數,它將保留在內存中並可用,直到用
clear symbols();<BR />// or<BR />clear globals();
如果您牢記這一點來執行代碼,您可能會明白為什麼 JSL 找不到該函數。