我已經就此事聯繫了 JMP 支援人員,這已被標記為錯誤。 這是可以看到此錯誤的簡單“真實”案例
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
f2 = function({}, {Default Local},
Summarize(dt, uniq_values = by(:sex));
all_sex_values = dt[0, "sex"];
//dt = dt; // don't remove, it just works
For Each({uniq_value}, uniq_values,
cur_sex_rows = Loc(all_sex_values, uniq_value);
show(all_sex_values, uniq_value, cur_sex_rows, dt); // dt goes poof inside for each
vals = Transform Each({val}, dt[cur_sex_rows, "age"], Output("List"), Char(val));
show(vals);
);
);
f2();
all_sex_values = {"F", "F", "F", "F", "F", "M", "M", "M", "F", "F", "F", "M", "M", "M", "M", "F", "F", "F", "F", "F", "M", "M", "M", "M", "M", "M", "M", "F", "F", "M", "M", "M", "M", "M", "F", "F", "M", "F", "M", "M"};
uniq_value = "F";
cur_sex_rows = [1, 2, 3, 4, 5, 9, 10, 11, 16, 17, 18, 19, 20, 28, 29, 35, 36, 38];
dt = ␀;
argument value is invalid in access or evaluation of 'Transform Each' , Bad Argument(dt[cur_sex_rows, "age"]), Transform Each/*###*/({val}, dt[cur_sex_rows, "age"], Output("List"), Char(val))
at line 15 in mypath
我正在編寫一個腳本,其中我必須加密其中的一小部分,因此我將必須加密的大部分程式碼包裝在單一函數中,以最大程度地減少變數洩漏的機會(在這種情況下我很懶) )。 在編寫這個過大的單一函數時,我注意到即使定義了所有變量,我在 For Each 循環中也會收到「參數值無效」錯誤。 我做了一些測試,發現對於每個(以及其他每個循環)都沒有正確處理預設本地(或看起來像那樣)。 下面是兩個例子
Names Default To Here(1);
thing = Expr(
Summarize(dt, uniq_values = by(:sex));
all_sex_values = dt[0, "sex"];
For Each({uniq_value}, uniq_values,
cur_sex_rows = Loc(all_sex_values, uniq_value);
vals = Transform Each({val}, dt[cur_sex_rows, "age"], Output("List"), Char(val));
show(vals);
);
);
f1 = function({}, {Default Local},
thing;
);
f2 = function({}, {Default Local},
Summarize(dt, uniq_values = by(:sex));
all_sex_values = dt[0, "sex"];
//dt = dt; // don't remove, it just works
For Each({uniq_value}, uniq_values,
cur_sex_rows = Loc(all_sex_values, uniq_value);
show(all_sex_values, uniq_value, cur_sex_rows, dt); // dt goes poof inside for each
vals = Transform Each({val}, dt[cur_sex_rows, "age"], Output("List"), Char(val));
show(vals);
);
);
f3 = function({}, {all_sex_values, cur_sex_rows},
Summarize(dt, uniq_values = by(:sex));
all_sex_values = dt[0, "sex"];
For Each({uniq_value}, uniq_values,
cur_sex_rows = Loc(all_sex_values, uniq_value);
vals = Transform Each({val}, dt[cur_sex_rows, "age"], Output("List"), Char(val));
show(vals);
);
);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Print("Thing Expr");
Try(thing, show(exception_msg));
Print("\!NThing Expr inside Function");
Try(f1(), show(exception_msg));
Print("\!NThing Function Only default local");
Try(f2(), show(exception_msg));
Print("\!NThing Function Only local list");
Try(f3(), show(exception_msg));
Close(dt, no save);
Names Default To Here(1);
my_val = 1;
my_func1 = function({}, {Default Local},
show(my_val);
);
my_func2 = function({}, {Default Local},
my_func1();
);
my_func22 = function({}, {Default Local},
my_func2();
);
my_func222 = function({}, {Default Local},
my_func = function({}, {Default Local},
show(my_val);
);
my_func();
);
my_func3 = function({}, {Default Local},
my_func1(); // even this goes null
For Each({z}, {"b","c"}, show(my_val));
);
my_func1();
my_func2();
my_func22();
my_func222();
my_func3();
我(秘密地)感到自豪的是,我可以將其(暫時)留給我的製作腳本,因為我還沒有那些(但我很有幫助,並至少為將來的我添加了案例編號)。
dt = dt; // don't remove, it just works (JMP Support Case 00075244)
我確實從聯繫 JMP 開發人員的 JMP 支援人員那裡得到了有關此問題的回應:
這看起來像是 Function Default Local 和 Each 函數之間的交互不良。 這是一個失敗的測試:
ut test("EachLoop", "Default Local in Body Expr", Expr(
defloc = 5;
f = Function({}, {Default Local}, Transform Each({x}, 1::5, x*defloc));
ut assert that(Expr(f), [5 10 15 20 25])
));
由於 defloc 是出現在函數體中的非限定名稱,因此它被標記為預設局部名稱。 這意味著如果我們寫入符號,JMP 會自動建立本地符號。 但是,當像上面的腳本一樣從中讀取時,它應該跳過本地幀並轉到下一幀和下一幀,直到此處和全局。 這是預期的行為,如果您在 Each 函數之外閱讀 defloc,則會得到這種行為。 但是,如果您閱讀 Each 函數的內部,您會發現此過程因某種原因而中斷。 可能是因為 Each 函數本身引入了另一個框架,因為它也可以有局部變數。
dt = dt 是一種解決方法,完全避免使用預設本地。