Re:expr()で宣言された変数のtype()に関する質問心に留めておくべき主なことはそれですPrint() 、書く()と公演()引数の扱いは、ほとんどの関数とは少し異なります。解凍されますが、評価されません。 したがってPrint(c)そのことを印刷しますcは-それは表現です。 タイプ()解凍して引数を評価し、型を返します。 お望みならばタイプ()より多くのように振る舞うPrint() 、次に使用する名前Expr() 、 なのでType(Name Expr(c))
Re:expr()で宣言された変数のtype()に関する質問ありがとうございました@ErraticAttach
私はあなたが説明していることをはっきりと理解しています。
しかし、私はあなたに質問があります。
もしもタイプ()が解凍されて評価され、次にExpr (a + b)はケース4で評価され、数値はの戻り値として返されるべきではありません。タイプ()ケース3のように?解凍後に型を評価する過程で、引数が変数として指定されているか関数として指定されているかによって処理が異なりますか?
Re:expr()で宣言された変数のtype()に関する質問CやC++などの言語は、呼び出しの前に関数呼び出しの引数を評価します。 式はコンパイル時にコードにコンパイルされるため、CおよびC++には式データ型がありません。 実行は速くなりますが、問題の解決について考える方法のいくつかが制限されます。
JSLには、文字列を取得して式ツリーに変換するparse()関数があります。 eval()関数はツリーを評価します。 ツリーは、特別な注意を払わない限り、割り当ての右側としてアクセスされると自動的に評価されます。誤って評価せずに変数に格納されている式を確認する必要がある場合にのみ使用する必要があるnameExpr()関数があります。 何らかの理由で、時間が失われ、おそらく今すぐ修正するには遅すぎるため、引数が単純な変数であるように見える場合は、引数を評価するための呼び出しなしでprint / show/writeが書き込まれました。 さて、当時は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() に関する質問ありがとうございました!!あなたは非常に役に立ちました! 
Re: expr() で宣言された変数の type() に関する質問ありがとうございました! 非常に役に立ちました。
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() を追加すると、式は eval になります。 別の方法は、常に引数を評価することでした。その後、通常の使用例では、式の周りに expr() が必要になります (expr(...) を評価するとその引数が返されるためです)。
expr()で宣言した変数のtype()についての質問です。やあ
「expr()」を使用していますが、いくつか質問があります。
コメントに書いてある番号に従って質問させていただきます。
1) cをそのまま実行するとeval()が適用されると考えて良いでしょうか?
2) -
3) expr() として宣言された変数 c の型をチェックすると Number が表示されるのはなぜですか?
type()で引数を実行して型を認識して結果を表示するのであれば、なぜ4)の場合はExpressionなのでしょうか。
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() に関する質問引数のタイプに応じて write が異なる動作を行うことが興味深いです。
逆のことを行う関数もいくつかあります。つまり、単純な名前を検索しますが、より複雑な式は評価しません。
使用する前に、どの関数が引数を「検索」、「展開」、「評価」するかの完全なリストを持っている人はいますか?
いくつのケースを考慮する必要がありますか?
最初の引数がリストであるかどうかをチェックするfor each のような特殊なケースがいくつかあることに気付きました。
x= Expr(Print(2));
y = "hello";
Write(x); // ->Print(2)
Write(y || " world"); // hello world
Head(x); // Print()
Type(x); //-> 2
...