
JMPのスクリプト言語であるJSLは、関数呼び出しから構築されています。 JSLで記述できるほとんどすべては、関数呼び出しです。 関数呼び出しのように見えないものもあります。
A = A + 3;
代入ステートメントの右側が式であることは明らかです。 代入ステートメント自体が式であることはあまり明白ではありません。
E = expr ( A = A + 3 );
exprは、式の周りで使用して、式が評価されないようにするためのラッパーです。 Eは、式の評価結果ではなく、式に設定されます。 Eをのぞくには、head関数を使用します。 Headは、式のルートにある関数の名前を返します。
show( head(E) );
Head(E)= Assign();
これで、割り当てを行うための関数があることがわかります。
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;プラスの右側
括弧のネストがツリーをどのように記述しているかに注目してください。 このツリーには、バイナリ分割のみがあります。 機能があります、 narg 、これは子の数を返します。 リーフノードの場合は0を返します。
narg(E)
2割り当て関数には、左側と右側の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 */
);
halfCats = halfCats / 2
JSLリストは同じ種類の式です。
list={33,44,55};
show(head(list));
show(narg(list));
show(arg(list,3));
Head(list)= {};リストには、次のような名前ではなく、頭の中かっこが表示されます割当
N Arg(list)= 3;
Arg(list、3)= 55;
リストの内容だけが必要な場合は、通常の添え字を使用する必要があります。
show(list[3]);
list [3] = 55;
しかし、リストを関数の引数に変換するようなことをしたい場合があります。
の中に象投稿すると、リストをパターンに変換する例が見つかります(5行目)。 その例と同じくらいクールな別の例を思いつくのに苦労していますが、リストがアルファベット順になっているかどうかを確認したいとします。 JMPの<演算子は、1回の関数呼び出しでそれを実行できます。
LT = expr("a"<"b"<"c"<"d");
show(head(LT));
show(narg(LT));
Head(LT)= Less();より小さい演算子は関数名を表示し、以下
N Arg(LT)= 4;
Less関数は多くの引数を取ることができますが、それらを入力する必要はありません。 下、 NameExprの後に、単語に格納されている式を取得していますSubstituteInto {を変更しましたリスト} することが以下()。 次に、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);
"アルファ"<"ブラボー"<"チャーリー"<"デルタ"<"エコー"<"フォックストロット"<"ゴルフ"<"ホテル"<
"インド"<"ジュリエット"<"キロ"<"リマ"<"マイク"<"11月"<"オスカー"<"パパ"<
"ケベック"<"ロメオ"<"シエラ"<"タンゴ"<"ユニフォーム"<"ビクター"<"ウイスキー"<"X線" <「ヤンキー」<「ズールー」
eval(words)
1 eval (words)は1を返し、Lessの結果がtrueであることを示します。
もう一つの例。
2017年2月28日更新-新しいコミュニティのフォーマットを修復
クレイグ、この記事は、表現の扱い方を理解するための私の継続的な探求において非常に役に立ちました。
私は実際に、リスト内の項目をLess()関数の引数に変換するという最後のトリックに適したアプリケーションを持っていました。 ダイアログウィンドウからのユーザー入力に基づいて、Col Mean()関数を含む列数式を生成したかったのです。 Col Means()関数は1つ以上の引数を取りますが、さまざまな数の引数(多くの場合変数名)を関数に置き換える巧妙な方法はありませんでした。 スクリプトのキーラインは次のとおりです。
arglist = {"身長"、 "年齢"、"性別"}; //ダイアログウィンドウの結果
statformula = Substitute(arglist、Expr({})、Expr(Col Mean())); //arglistの項目はColMeans()関数の引数になります
newcol << Formula(Name Expr(statformula));
実際のスクリプトは、Name( "")を必要とする厄介な列名を処理する必要があるため、より複雑ですが、理解できます。 この巧妙なトリックを見せてくれてありがとう。
ハワード・ローチ