我可以使用連接字串作為函數的參數嗎?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />考慮這個簡單的例子:
dt2 = 當前資料表();
b = 140;
bc = char(b);
印刷(b);
列印(BC);
dt2 << 新欄位("範圍"||bc||"v1",
數字,
式(b)
);
// dt2 = 當前資料表();
dt2 << 新欄位("範圍",
數字,
公式(最大值(:名稱("AA"||bc), :名稱("BB"||bc), :名稱("CC"||bc)) - 最小值(:名稱("AA"|| bc) , :名稱("BB"||bc), :名稱("CC"||bc)))
);
這是表:

傳回錯誤訊息:

我很少進行 JSL 編程,所以請幫忙!!我希望這個能起作用。
回覆:我可以使用連接字串作為函數的參數嗎?哎呀,對此我很抱歉! 深夜JSL編碼看起來克雷格確實發現了導致該問題的括號錯誤,並且還簡化了事情(謝謝克雷格!)。
朱利安
回覆:我可以使用連接字串作為函數的參數嗎?嗨克雷格,
我會嘗試一下。我認為我最終在腳本中使用 Name() 的原因是我將其直接從公式編輯器複製出來以獲得不同的公式。現在我想我看到了括號的問題。
謝謝!
回覆:我可以使用連接字串作為函數的參數嗎?嗨朱利安,
我嘗試了你的腳本,它似乎部分有效。當我運行它時,我得到了這個:

Range 欄位下的值應為 5,而非 15。
日誌是這麼說的(我不懂):

似乎最大值被正確評估,然後就停在那裡。有任何想法嗎?感謝您的協助
腳本:
dt2 = 當前資料表();
b = 140;
bc = char(b);
印刷(b);
列印(BC);
dt2 << 新欄位("偏差"||bc||"v1",
數字,
式(b)
);
// dt2 = 當前資料表();
dt2 << 新欄位("範圍",
數字,
);
評估(解析(評估插入(
“\[
:範圍<< 設定公式( 最大值(:名稱("^"AA_"||bc^"), :名稱("^"BB_"||bc^"), :名稱("^"CC_"|| bc )^") -
最小值(:名稱("^"AA_"||bc^"), :名稱("^"BB_"||bc^"), :名稱("^"CC_"||bc^"))
)
]\")));
回覆:我可以使用連接字串作為函數的參數嗎?朱利安回復後提供了更多資訊。
是的,您可以使用串聯來建立大多數函數的參數。名字是非常奇怪的例外之一。 Name() 是一個解析時幫助器,而不是執行時間函數。
大多數 JSL 變數名稱的格式都很好,是字母、數字、底線和空格的序列,很容易被 JMP 解析器理解。你的名字, AA_140等,結構良好。有時變數名會變得很混亂。通常,這種情況發生在嵌入逗號或減號時: X射線或者蘋果、梨。無論如何,您無法在不引用這些變數名的情況下編寫 JSL 表達式。 Name() 包裝器就是這樣做的:
名稱(“X射線”)+名稱(“蘋果,梨”)
會將兩個變數加在一起。Name 是在解析 JSL 原始碼時處理(而不是執行)的,而不是在執行時處理的。Name 的參數在解析時必須是一個簡單的字串。Julian 的程式碼使用 JMP 的字元函數來預先建立連接的字串並將其傳送到解析函數。
因為變數名稱格式良好(總是一個好主意),所以不需要名稱包裝器,並且 Julian 的想法可以進一步簡化。(這也修復了錯誤的括號。)
評估(解析(評估插入(
“\[
:範圍 << 設定公式(
最大值(^":AA_" || bc^, ^":BB_" || bc^, ^":CC_" || bc^) -
最小值(^":AA_" || bc^, ^":BB_" || bc^, ^":CC_" || bc^) )
]\")));

還有其他 JSL 函數可以直接操作公式,無需建立和解析字串,但 Julian 的 EvalInsert 想法讓您可以在 JSL 中使用友善的字元操作。
回覆:我可以使用連接字串作為函數的參數嗎?你好謝赫扎德·卡卡,
我可以透過使用 eval、parse 和 eval insert 來建立表達式來實現此目的。 既然您說您是 JSL 新手,我想這看起來會非常神秘,所以讓我逐步介紹其中的兩個重要部分。
我做的第一件事是將公式設定為它自己的部分,與建立列分開。 這樣我們就可以專注於建立一個僅設定列公式的表達式。 其中大部分內容是 Eval(Parse(EvalInsert( )));是在做。EvalInsert 是一個巧妙的工具,用於獲取字串並替換變數或變數的函數。 指定您想要替換的方法是將 ^ ^ 包裹在函數或變數周圍。 例如:
g =「世界」;
h = EvalInsert("你好^g^");
標題(h);
在這種情況下,h 等於“hello world”,這就是上面程式碼將顯示在標題框中的內容。
在您的情況下,我使用 evalInsert 作為列名稱:
:名稱("^"AA_"||bc^")
如果我們把它拆開就會更清楚
:名稱(" ^ "AA_" || bc ^ ")
:Name() 函數需要引用文本,因此括號的開頭和結尾都有引號。 接下來,我們將 ^ ^ 包裹在您的串聯中。 Evalinsert 對其進行處理,並且 :Name() 函數留下帶引號的字串 AA_140。 EvalInsert 將取代所有包含在 ^ ^ 中的內容。 有一個特殊的複雜情況,即我們正在建立的表達式需要在其中包含引號,但我們必須使用引號來指定字串本身。 為了處理這個問題,我們可以透過在每個引號前面加上 \! 來告訴 JMP 每個引號實際上是引號字元(而不是 JMP 語法的一部分)。 (slash-bang) 或按照我在下面所做的那樣,將 \[ 放在起始引號後面,並將 ]\ 放在最後引號前面。 這「轉義」了我們正在建構的表達式中的所有引號。
接下來,Parse() 將字串轉換為 JSL 表達式,最後 Eval() 運行 JSL 表達式,將公式指派給該列。
我希望這有幫助!
朱利安
ps:您的程式碼沒有列名稱下劃線,所以我新增了這些。
dt2 =目前數據表() ;
乙= 140 ;
西元前=字元(乙) ;
列印(乙) ;
列印(西元前) ;
dt2 <<新專欄( “範圍” ||西元前|| “v1” ,
數位,
公式(乙)
) ;
// dt2 = 當前資料表();
dt2 <<新專欄( “範圍” ,
數位,
) ;
評估(解析(評估插入(
“\[
:範圍<< 設定公式( 最大值(:名稱("^"AA_"||bc^"), :名稱("^"BB_"||bc^"), :名稱("^"CC_"|| bc )^") - 最小值(:名稱("^"AA_"||bc^"), :名稱("^"BB_"||bc^"), :名稱("^"CC_"||bc ^" ))
)
]\" ))) ;