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()に関する質問心に留めておくべき主なことはそれですPrint() 、書く()と公演()引数の扱いは、ほとんどの関数とは少し異なります。解凍されますが、評価されません。 したがってPrint(c)そのことを印刷しますcは-それは表現です。 タイプ()解凍して引数を評価し、型を返します。 お望みならばタイプ()より多くのように振る舞うPrint() 、次に使用する名前Expr() 、 なのでType(Name Expr(c))
Re:expr()で宣言された変数のtype()に関する質問ありがとうございました@ErraticAttach
私はあなたが説明していることをはっきりと理解しています。
しかし、私はあなたに質問があります。
もしもタイプ()が解凍されて評価され、次にExpr (a + b)はケース4で評価され、数値はの戻り値として返されるべきではありません。タイプ()ケース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()は<<演算子です。 引数リストには、特別な引数を識別するための異常な使用法があります。多くの場合、実際のメッセージは作成中のディスプレイボックスに送信されます。)列に数式式を追加することは、私をつまずかせる1つの例です。引数を評価してはならないことを前提としています。 数式の前後にeval()を追加すると、数式がevalになります。これは、formula(...)が引数をピークするためです。 別の方法は、常に引数を評価することでしたが、通常のユースケースでは、式の前後にexpr()が必要になります(expr(...)を評価すると引数が返されるだけだからです)。
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
関連するビットは次のとおりです。
