
JMP のスクリプト言語である JSL は、関数呼び出しから構築されています。 JSL で記述できるほとんどすべては関数呼び出しです。 関数呼び出しのように見えないものもあります。
A = A + 3;
代入ステートメントの右側が式であることは明らかです。 代入ステートメント自体が式であることはあまり明らかではありません。
E = expr ( A = A + 3 );
expr は、式の評価を防ぐために式の周囲に使用できるラッパーです。 E は式の評価結果ではなく、式に設定されます。 E を覗くには、head 関数を使用します。 Head は式のルートにある関数の名前を返します。
show( head(E) );
ヘッド(E) = 割り当て();
これで、割り当てを行うための関数があることがわかります。
Assign( testing, 3+4 );
7
show(testing)
テスト = 7;
JSL の式は実際にはツリーです。 これは a=a+3 ツリーの図です。上が根、下が葉です。

Head 関数と同様に、Arg 関数を使用して Assign 関数の子にアクセスできます。
show( arg(E,1) );
Arg(E, 1) = A;左側
show( arg(E,2) );
Arg(E, 2) = A + 3;右側
さらに深く掘り下げていくと、
show(head(arg(E,2)))
Head(Arg(E, 2)) = Add();右側の頭
show(arg(arg(E,2),1))
Arg(Arg(E, 2), 1) = A;プラスの左側
show(arg(arg(E,2),2))
Arg(Arg(E, 2), 2) = 3;プラスの右側
括弧の入れ子がツリーをどのように表現しているかに注目してください。 このツリーにはバイナリ分割のみがあります。 という機能があり、ナルグ、子の数を返します。 リーフノードの場合は 0 を返します。
narg(E)
2 assign 関数には、左側と右側の 2 つの引数があります。
JMPのためにステートメントは 4 つの引数を取る関数呼び出しです。 他の関数と同様に、引数をカンマで区切っていることに注意してください。
halfCats = 1;
for( iCat = 1, iCat <= 10, iCat++,
halfCats = halfCats / 2;
write( iCat, " ", halfCats , "\!n" )
);
1 0.5
2 0.25
3 0.125
4 0.0625
5 0.03125
6 0.015625
7 0.0078125
8 0.00390625
9 0.001953125
10 0.0009765625
4 つの引数を区切るには 3 つのコンマが必要です。 この中でためにステートメントの場合、4 番目の引数はセミコロンで区切られた 2 つのステートメントです。 4 番目の引数を調べて、それが実際に関数であるかどうかを確認します。
Head(
Arg(
Expr(
For( iCat = 1, iCat <= 10, iCat++,
halfCats = halfCats / 2;
Write( iCat, " ", halfCats, "\!n" );
)
),
4 /* the fourth arg */
)
);
のり()
のり一連のステートメントをまとめて保持する関数の名前です。のりの最初の引数は最初のステートメントなどです。
Arg(
Arg(
Expr(
For( iCat = 1, iCat <= 10, iCat++,
halfCats = halfCats / 2;
Write( iCat, " ", halfCats, "\!n" );
)
),
4 /* the fourth arg is two statements, glued together */
),
1 /* the first arg is the first of the two glued statements */
);
ハーフキャット = ハーフキャット / 2
JSL リストも同じ種類の式です。
list={33,44,55};
show(head(list));
show(narg(list));
show(arg(list,3));
ヘッド(リスト) = {}; list には、次のような名前ではなく、先頭の中括弧が表示されます。割当
N 引数(リスト) = 3;
Arg(リスト, 3) = 55;
リストの内容だけが必要な場合は、通常の添え字を使用する必要があります。
show(list[3]);
リスト[3] = 55;
しかし、リストを関数の引数に変換するようなことをしたい場合もあります。
の中に象この記事では、リストをパターンに変換する例を示します (5 行目)。 これと同じくらい素晴らしい例を他に思いつくのは難しいですが、リストがアルファベット順になっているかどうかを確認したいとします。 JMP の < 演算子は、単一の関数呼び出しでこれを行うことができます。
LT = expr("a"<"b"<"c"<"d");
show(head(LT));
show(narg(LT));
頭(LT) = 少ない();小なり演算子は関数名を表示します。以下
N 引数(LT) = 4;
Less 関数は多くの引数を取ることができますが、それらを入力する必要はありません。 下、名前式の後に、単語に格納されている式を取得しています。代入{を修正しましたリスト} することが以下()。 次に、JMP は、読みやすくするために < を使用して Less 関数を表示します。
words =
{"Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel", "India",
"Juliet", "Kilo", "Lima", "Mike", "November", "Oscar", "Papa", "Quebec", "Romeo",
"Sierra", "Tango", "Uniform", "Victor", "Whiskey", "Xray", "Yankee", "Zulu"};
Substitute Into( words, Expr( {} ), Expr( Less() ) );
nameExpr(words);
「アルファ」 < 「ブラボー」 < 「チャーリー」 < 「デルタ」 < 「エコー」 < 「フォックストロット」 < 「ゴルフ」 < 「ホテル」 <
「インディア」 < 「ジュリエット」 < 「キロ」 < 「リマ」 < 「マイク」 < 「ノベンバー」 < 「オスカー」 < 「パパ」 <
「ケベック」<「ロミオ」<「シエラ」<「タンゴ」<「ユニフォーム」<「ビクター」<「ウィスキー」<「エックスレイ」 < 「ヤンキー」 < 「ズールー語」
eval(words)
1評価(words) は 1 を返し、Less の結果が true であったことを示します。
もう一つの例。
更新 2017 年 2 月 28 日 - 新しいコミュニティのフォーマットを修復
Craig、この記事は、式の扱い方を理解する探求を続ける私にとって非常に役に立ちました。
実際、リスト内の項目を Less() 関数の引数に変換するという最後のトリックに適したアプリケーションがありました。 ダイアログ ウィンドウからのユーザー入力に基づいて、Col Mean() 関数を含む列式を生成したいと考えていました。 Col Means() 関数は 1 つ以上の引数を受け取りますが、さまざまな数の引数 (多くの場合は変数名) を関数に代入する巧妙な方法はこれまでにありませんでした。 私のスクリプトの重要な行は次のとおりです。
arglist = {"身長", "年齢", "性別"}; // ダイアログウィンドウからの結果
statformula = Substitute ( arglist, Expr( {} ), Expr( Col Mean() ) ); // arglist 内の項目は Col Means() 関数の引数になります
newcol << Formula( Name Expr( statformula ) );
実際のスクリプトは、Name(" ") を必要とする乱雑な列名を処理する必要があるため、より複雑ですが、理解していただけたでしょうか。 この巧妙なトリックを教えてくれてありがとう。
ハワード・ラウシュ