回复:JSL 函數中的變量行為gzmorgan,感謝您的洞察力。 當前的 window() 解決方案看起來可能是最簡單的解決方案,但它對我不起作用……至少,不是我嘗試編寫代碼的方式。 我嘗試對大多數變量主要使用 eval sub() 命令,這有效,但不適用於 nw(我的新窗口變量)或當前窗口的 _cw。 我可能只是錯過了什麼,但沒關係。
我最終回到了您的另一個建議,即 Vince 之前提出的 window 命名空間。 到目前為止,我還沒有遇到任何問題。
關於applicaiton builder,我知道但沒用過。 我通常只編寫自己的 GUI 和函數,然後手動創建插件。 我很難理解 set 函數和 this(或 self)以及什麼叫什麼,但我想我現在明白了...... 我會仔細看看。
感謝大家的投入。 我真的很感激不同的方法/建議。 我的腳本採用一組相關參數並以幾種不同的方式繪製它們,但是設置它並手動單擊參數然後導出它需要幾分鐘時間。 通過這些更新,並從主文件循環,我可以從單獨的調用腳本而不是 GUI 調用腳本,並讓它生成 N 個圖而不是一組圖。 過去需要幾個小時……現在是十秒鐘。當然,我花了很長時間才來到這裡,但我可以重複使用它多年。
回复:JSL 函數中的變量行為哎呀!忘記提及,除了“this”和窗口命名空間之外,您還可以只引用當前窗口。我附上了備用腳本,
回复:JSL 函數中的變量行為我打算建議使用 Window 命名空間,這是一個很好的建議。我通常不使用 UI 窗口的函數。另一種引用本地對象的方法是使用 Set 函數並獲取其句柄。 腳本如下。我使用了更簡單的打印語句。您可能想要探索 App 開發器的使用,了解它的工作原理需要花費一些資金,但它非常方便。
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show (A);
show(B);
show(Z);
nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
<<SET function=""></SET>回复:JSL 函數中的變量行為謝謝文斯。 我不知道窗口命名空間。 這可能會奏效,我會試試的。
現在我已經將我的 GUI 部分放在一個文件中,我打算將變量傳遞給我將稱之為 main 函數的部分。 我要么從插件工具欄調用 GUI,要么運行一個小的自定義腳本,該腳本將循環 N 次,為 N 組輸入參數調用主腳本。 可重用性在這裡可能是一個問題,但覆蓋變量可能無關緊要...... 我會看看進展如何。 感謝您的幫助。
回复:JSL 函數中的變量行為如果您使用全局變量或全局命名空間,問題是可重用性(您可能不關心)。
如果您使用兩個不同的按鈕運行 myFun 兩次(假設您希望能夠將您的窗口沙盒化並運行它的兩個實例)。您將發生碰撞,第二次調用將覆蓋第一次調用。
見下文。
names default to here(1);
new namespace("test");
test:myFun = Function({A1, Z1},{Default Local},
test:A = A1;
test:Z = Z1;
test:A[2] = 10;
test:B = 2*test:A;
show(test:A);
show(test:B);
show(test:Z);
//::g_b = b;
//::g_z = z;
test:nw = new window("test",
vlistbox(
textbox(test:Z),
textbox(char(test:B)),
buttonbox("Show array B (works)",
show(test:B)
),
buttonbox("Show string Z (works)",
show(test:Z)
),
buttonbox("show and close (works)",
show(test:Z, test:B); test:nw << closewindow())
)
)
);
x = [2,3];
y ="string";
test:myFun(x,y);
test:myFun([12, 14], "something else");
如果您使用命名空間,我建議使用 window 命名空間。 當窗口消失時它會自動刪除,並且兩個相同的窗口之間不會發生碰撞。
names default to here(1);
myFun = Function({A1, Z1},{DEFAULT LOCAL},
A = A1;
Z = Z1;
A[2] = 10;
B = 2*A;
show(A);
show(B);
show(Z);
//::g_b = b;
//::g_z = z;
nw = new window("test",
window:B = B; //uses the builtin window namespace
window:Z = Z; //works because this is a glue statement that returns the last thing
window:box = vlistbox( //which in this case is the vlistbox
textbox(window:Z),
textbox(char(window:B)),
buttonbox("Show array B (works)",
show(window:B)
),
buttonbox("Show string Z (works)",
show(window:Z)
),
buttonbox("show and close (works)",
show(window:Z, window:B); window:box << closewindow())
)
);
);
x = [2,3];
y ="string";
myFun(x,y);
myFun([12, 14], "something else");回复:JSL 函數中的變量行為謝謝文斯。 我沒想到 eval(substitute(expr()))。 對於我的一些更複雜的腳本,我認為跟踪被替換的內容和位置可能太難了。 我的代碼組織得不太好,調試起來很困難。回复:JSL 函數中的變量行為謝謝,你的全局想法給了我另一個想法。我不太介意變量是全局的這一事實,但如果它們確實需要是全局的,我寧願將它們限定在一個包含的命名空間中。
我不認為 clear globals() 命令會在這裡咬我,但它讓我有了我的召回函數(我的全局召回變量被另一個使用 clear globals() 的腳本清除了)。我給 JMP 發了郵件,他們提出了兩種選擇:通過鎖定全局變量或將它們放在自己的命名空間中來保護全局變量。 命名空間實際上在健壯性方面更直接。
無論如何,下面更新的代碼似乎工作正常。 缺點是每次我引用一個變量時都要額外輸入“test:”。 我意識到我可能不需要為腳本中的每個變量使用它,但另一方面,這可能是一種很好的做法,因為這種特殊用途是全局命名空間,我可以通過將光標懸停在變量名稱上來查看變量內容。
注意 A1 和 Z1 的使用。 它沒有讓我分配給 test:A 和 test:Z。
錯誤:參數應該在“Function”的訪問或評估中列出,Function/*###*/({test:A, test:Z}, .....
我會看看是否可以使用多個文件。
new namespace("test");
test:myFun = Function({A1, Z1},{Default Local},
test:A = A1;
test:Z = Z1;
test:A[2] = 10;
test:B = 2*test:A;
show(test:A);
show(test:B);
show(test:Z);
//::g_b = b;
//::g_z = z;
test:nw = new window("test",
vlistbox(
textbox(test:Z),
textbox(char(test:B)),
buttonbox("Show array B (works)",
show(test:B)
),
buttonbox("Show string Z (works)",
show(test:Z)
),
buttonbox("show and close (works)",
show(test:Z, test:B); test:nw << closewindow())
)
)
);
test:x = [2,3];
test:y ="string";
test:myFun(x,y);回复:JSL 函數中的變量行為我不得不求助於設置全局變量來完成這項工作。似乎對話框代碼無法正確看到變量。這不是一個很好的解決方案,因為它違背了在函數中使用局部變量的目的。
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show(A);
show(B);
show(Z);
::g_b = b;
::g_z = z;
::g_nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
show(::g_B)
),
buttonbox("Show string Z (does not work)",
show(::g_Z)
),
buttonbox("show and close (does not work)",
show(::g_Z, ::g_B); ::g_nw << closewindow())
)
)
);
x = [2,3];
y ="string";
myFun(x,y);回复:JSL 函數中的變量行為B甚至沒有為我工作。
這通常是我做 GUI 東西的方式。對於您給出的示例來說,它過於復雜,但我認為它顯示了幾種不同的方法。
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
Eval(
Substitute(
Expr(
nw = new window("test",
vlistbox(
textbox(char(DV_Z)),
textbox(char(DV_B)),
buttonbox("Show array B (works)",
show([]||DV_B); //otherwise you run into an invalid matrix token
),
buttonbox("Show string Z (does not work)",
//show([]||DV_Z); //shouldn't work, you can't make a string a matrix
show(DV_Z);
//or
show(list(DV_Z));
),
buttonbox("show and close (does not work)",
<<SET function=""></SET>JSL 函數中的變量行為
我的腳本通常有兩個主要組件:一個主函數,後跟 GUI 代碼,所有這些都在同一個文件中。 我通常使用 Here 命名空間中包含的變量,從用戶輸入中獲取變量,然後從“確定”按鈕框中調用主函數。 我不向主函數傳遞任何變量,而只使用在“確定”按鈕框腳本上分配的變量。 我正在考慮更改至少一個腳本,以便第一個文件具有 GUI,第二個文件具有主要功能。 在執行此操作之前,我將檢查它在一個 JSL 文件中的工作原理。 下面是一個精簡的示例,繞過 GUI,僅在定義函數之後但調用之前定義變量。
我注意到的一件事是,腳本運行後很難調試,因為當我將鼠標懸停在 x 和 y 上時,我可以看到窗口底部狀態欄中的內容。 但對於局部變量 A、B、Z 和 nw 來說情況並非如此。 我想知道是否有人對此有任何提示。
我也不確定如何從按鈕框腳本訪問變量內容。 如果運行下面的代碼,您可以看到 A、B、Z 按預期顯示在日誌中(在創建新窗口之前),並且 B 和 Z 也顯示在新窗口文本框中,但是按鈕box 腳本無法直接訪問這些變量。 我能夠使用 eval(parse(eval insert())) 來獲取數組 B,但我無法獲取字符串 Z。有沒有更直接的方法可以讓它發揮作用?
names default to here(1);
myFun = Function({A, Z},{Default Local},
A[2] = 10;
B = 2*A;
show (A);
show(B);
show(Z);
nw = new window("test",
vlistbox(
textbox(Z),
textbox(char(B)),
buttonbox("Show array B (works)",
show(parse(Eval(Parse(Eval Insert(
"\[^"char(B)"^]\"
)))))
),
buttonbox("Show string Z (does not work)",
show(Eval(Parse(Eval Insert(
"\[^"char(Z)"^]\"
))))
),
buttonbox("show and close (does not work)", show(Z, B); nw << closewindow())
)
)
);
x = [2,3];
y="string";
myFun(x,y);
謝謝,
麥克風
自動化和腳本編寫質量和工藝工程