Re: 關於用 expr() 聲明的變量的 type() 的問題要記住的主要事情是打印() ,寫()和顯示()對待他們的論點與大多數函數有點不同——他們解包但不評估。 因此打印(c)將打印的東西C is——它是一個表達式。 類型()將解包然後評估它的參數然後返回它的類型。 如果你想類型()表現得更像打印() ,然後使用名稱 Expr() , 作為類型(名稱表達式(c))
Re: 關於用 expr() 聲明的變量的 type() 的問題謝謝@ErraticAttach
我很清楚你在解釋什麼。
不過,我有一個問題要問你。
如果類型() 被解包和評估,然後表達式(a + b) 在情況 4 中進行評估,不應將 Number 作為返回值返回類型() 與案例 3 一樣?在解包後評估類型的過程中,根據參數是指定為變量還是函數,處理是否有所不同?
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
這是相關的位:

Re: 關於用 expr() 聲明的變量的 type() 的問題謝謝你!!你非常有幫助! 
回复:關於用 expr() 聲明的變量的 type() 的問題謝謝! 變得很有幫助。
回复:關於用 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(...) 只會返回其參數。)
關於用 expr() 聲明的變量的 type() 的問題你好
我正在使用“expr()”,我有幾個問題。
我會按照評論裡寫的數量提問。
1)是否可以認為c原樣執行時應用了eval()?
2)-
3) 為什麼當檢查聲明為expr()的變量c的類型時會出現Number?
如果 type() 執行參數,識別類型並顯示結果,我想知道為什麼在 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
謝謝 :)
質量和工藝工程回覆:關於用 expr() 宣告的變數的 type() 的問題有趣的是,根據參數的類型, write 會做不同的事情。
還有一些其他函數執行相反的操作:它們會尋找簡單的名稱,但不計算更複雜的表達式。
有沒有人有一個完整的列表,其中列出了哪個函數在使用它之前“查找”,“解包”,“評估”......它是參數?
需要考慮多少種情況?
我注意到有一些特殊情況,例如for every - 它檢查第一個參數是否是列表。
x= Expr(Print(2));
y = "hello";
Write(x); // ->Print(2)
Write(y || " world"); // hello world
Head(x); // Print()
Type(x); //-> 2
...