關於用 expr() 聲明的變量的 type() 的問題你好
我正在使用'expr()',我有幾個問題。
我會根據評論中寫的數字提問。
1) 是否可以認為當 c 按原樣執行時應用了 eval() ?
2) -
3)為什麼檢查聲明為expr()的變量c的類型時會出現Number?
如果 type() 執行參數,識別類型並顯示結果,我想知道為什麼它是 Expression in case of 4)。
4) -
a = 1;
b = 2;
c = expr(a + b);
c; // 1) Result : 3
print(c); // 2) Result : a + b
type(c); // 3) Result : Number
type(expr(a + b)); // 4) Result : Expression
謝謝 :)
腳本Re: 關於用 expr() 聲明的變量的 type() 的問題要記住的主要事情是打印() ,寫()和顯示()對待他們的論點與大多數函數有點不同——他們解包但不評估。 因此打印(c)將打印的東西C is——它是一個表達式。 類型()將解包然後評估它的參數然後返回它的類型。 如果你想類型()表現得更像打印() ,然後使用名稱 Expr() , 作為類型(名稱表達式(c))
Re: 關於用 expr() 聲明的變量的 type() 的問題謝謝@ErraticAttach
我很清楚你在解釋什麼。
不過,我有一個問題要問你。
如果類型() 被解包和評估,然後表達式(a + b) 在情況 4 中進行評估,不應將 Number 作為返回值返回類型() 與案例 3 一樣?在解包後評估類型的過程中,根據參數是指定為變量還是函數,處理是否有所不同?
Re: 關於用 expr() 聲明的變量的 type() 的問題a = 1;
b = 2;
type( a + b );
“數字”
在內部,type 收到一個看起來像 add(a, b) 的表達式樹。 樹被評估為一個數字。
a = 1;
b = 2;
type( expr( a + b ) );
“表達”
在內部,type 收到一個看起來像 expr( add( a, b ) ) 的表達式樹。 再次評估樹;樹中的 expr() 節點將其參數作為表達式返回。
a = 1;
b = 2;
c = expr( a + b );
type( c );
“數字”
在內部,type 收到一個看起來像 c 的表達式樹。 再次對其進行評估。 c 是一個表達式 add(a,b),每當計算 c 時,它將使用 a 和 b 的當前值。c 在其樹中沒有 expr() 節點。
“解包”在 JSL 中並不是一個定義明確的想法。 每個內置函數最初都將其參數視為表達式樹。 一些函數在不先查看它們的情況下評估它們的參數。 其他函數從不評估它們。 有些函數會查看表達式的根節點是 eval() 還是 expr() 還是 send() 並做一些不同的事情。 (send() 是 << 運算符。 在參數列表中有一個一元用法來識別特殊參數,通常是實際消息被發送到正在創建的顯示框。)將公式表達式添加到列是一個有時讓我絆倒的例子;它假定不應評估該論點。 在公式周圍添加 eval() 會導致它進行評估,因為 formula(...) 會窺視參數。 另一種方法是始終評估參數,然後正常用例需要 expr() 圍繞公式(因為評估 expr(...) 只返回其參數。)
Re: 關於用 expr() 聲明的變量的 type() 的問題像 C 和 C++ 這樣的語言在調用之前評估函數調用的參數。 C 和 C++ 沒有 Expression 數據類型,因為表達式在編譯時被編譯成代碼。 執行速度更快,但限制了您解決問題的一些方法。
JSL 有一個 parse() 函數,它接受一個字符串並將其轉換為一個表達式樹。 eval() 函數評估樹。 當作為作業的右側訪問時,樹會自動評估,除非特別注意偷看它。有一個 nameExpr() 函數,僅當您需要查看存儲在變量中的表達式而不意外評估它時才應使用該函數。 出於某種原因,如果參數看起來是一個簡單的變量,則在時間上丟失了,並且現在修復可能為時已晚,打印/顯示/寫入沒有調用來評估它們的參數。 好的,當時它可能看起來像是一個加速,因為 eval(c) 有一些開銷,而不是僅僅獲取 c 的值。 但是 print(c+0) 會計算參數,print(eval(c)) 也會計算參數,因為參數不是一個簡單的變量。
Re: 關於用 expr() 聲明的變量的 type() 的問題@Craige_Hales肯定是對的——拆包不是一個好詞,如有任何混淆,請見諒!我試圖描述的行為已記錄在案 - 檢查此鏈接: https://www.jmp.com/support/help/en/15.2/index.shtml#page/jmp/expressions.shtml
這是相關的位:
