で働いていたにも関わらずJMP 10年以上、私はまだ新しいことを学んでいます。 ごく最近では、石川ダイアグラムと再帰の力の新しい見方でした。 どちらも何年も前から存在していますが、私が気にかけたのは、特定の課題に直面するまではありませんでした。 この新しい動機は、私が開発していたときに来ましたジオコーディング 2020サーバーとの通信に REST API を使用するアドインです。 サーバーからのデータは JSON 配列の形式で、データによっては非常に大きくなる可能性があります。 の隠された宝石の 1 つJMP (より具体的には、JSL で) は、JSON 配列を JSL リストまたは連想配列に変換するコマンド Parse JSON() です。 これは非常に良い出発点でしたが、それでも、データの特定の部分を取得したい場合は、それらを見つけて対処する方法を知る必要がありました. その配列がリストや配列に深く積み上げられた数百の項目から構成されている場合、簡単な作業ではありません。 そこで、この役に立つ小さなプログラムを書くことにしました。 stackmole.jsl 、データ構造の概要を教えてください。 そして、グラフィカルなプレゼンテーションを探していなければ、私は立派な JMPer ではありませんでした。
サーバー呼び出しごとに、深さ、幅、ボリュームがまったく異なるデータが配信される可能性があります。 データの一部の有無は、データ自体に依存します。 そのデータ構造がどのように見えるかを事前に知ることは不可能です。 データを検索し続けるか、次のリストまたは配列を検索するか、または最後にあるかを自分で判断できるプログラムが必要でした。 再帰は、その問題に対する私の答えでした。 数学の再帰的な定義は知っていますが、それはデータ構造ではどのように機能しますか? 意外と元気!
データ構造と再帰のステップバイステップ
再帰とは、前のステップで生成した結果に同じルールまたはロジックを適用することを意味します。 整数の階乗の定義は、最も広く知られている例です。 数値の階乗は、その数値と小さい数値をすべて 1 にした積です。つまり、3 の階乗は 3 と書かれることがよくあります。 = 3 * 2 * 1 = 6. Scripting Guide には、そのルーチンのステートメントが示されています。
myfactorial = Function( {a},
If( a == 1,
1,<BR /> a * Recurse( a - 1 )
)
);
再帰は関数にのみ適用できます。コマンドは関数自体の中にあり、その関数を新しい引数で呼び出します。 3! の例では、関数は 3 を引数として呼び出されます: myfactorial(3)。 3 は 1 に等しくないため、IF ステートメントの else 句が実行されます。 これは、myfactorial (2) の結果に 3 を掛けることを意味します。 繰り返しますが、これは 1 に等しくなく、else 節は myfactorial(1) の結果で 2 を乗算します。 今、結果があります。 1です。
JMP は、前のオープン タスクがこの結果 (2 * 1 = 1) で 2 を乗算することであり、その前のタスクが再帰結果 (3 * 2 = 6) で 3 を乗算することであったことを記憶しています。 3 が最上位レベルだったので、結果は 6 です。 その仕組みは、階段を降りることに例えることができます。 すべてのステップで、開いているタスクが置かれます。 プログラムは、再帰がなくなるまで、必要なだけステップを進めます。 階段を上る途中で、すべてのタスクを収集し、最初のフロアで結果を出します。
JSL はいくつかのデータ コレクションを認識しています (たとえば、多くの値を表す変数)。 このプログラムで解析できる構造は、リストと連想配列です。 リストは、次のような要素のカンマ区切りのリストです。
リスト = {"a", "b", 1, 2}
連想配列は、キーと値のペアのリストです。
assarr = ["a" => "This", "b" => "is", "c" => "a", "d" => "文"];
各ペアの最初の要素がキーです。 2 番目は値です。 キーは一意である必要があり、内部でアルファベット順にソートされます。
概念が異なるため、構造ごとに内容を変更または読み取るためのコマンドが異なります。スクリプト ガイドで参照できます。 単純なリストを分析すると、スタック モグラはどのような出力を生成するでしょうか?
list = {"a1", "b1", "c1"};
stackmole (l);

データ テーブルは、モグラが構造の深さまで掘り下げたときに見つけたアイテムのリストです。 行は、子の観点から解釈されます。 セット全体がリストであり、最初の子 (レベル 2) がそのリストの最初の項目です。 この子 (行 2) はデータで、その値は「a1」です。 データはすべての旅の終着点です。つまり、他にアイテムがない場合、アイテムはゼロです。
より有益なのは、石川図を階層的なスタイルにした原因と結果の図です。 下部には、角括弧内のインデックスの上にデータ値があります。 この小さな例では、セット全体の名前は「リスト」なので、「b1」を取得したい場合はリスト [2] です。
平行プロットは、セット全体が 3 つの要素に分割され、次のレベルの要素にはデータが含まれているため、分割されていないことを示しています。 小さな構造を理解するのに役立ちますが、この記事の最後に、何の役にも立たないカラフルな平行線図を示します。
連想配列の結果は、キーの名前が含まれているという点で、リスト レポートとは少し異なります。
sentencearray = ["a" => "This", "b" => "is", "c" => "a", "d" => "sentence"];
stackmole(sentencearray);

セット全体の型は aa で、連想配列の略です。 セット全体は「sentencearray」と呼ばれます。その配列内の単語「文」にアクセスする場合は、文配列 [「d」] を使用してアクセスします。
この方法は、一連の要素を持つ 1 つの構造のみを使用するため、簡単です。 しかし、JMP では、これらの構造を任意の方法と深さで積み重ねることができます。 したがって、リストの連想配列の連想配列のリストがあるかもしれません… この例では:
array = ["2list1" => {{"4list1_1", "4list1_2", "4list1_3"}, {"4list2_1", "4list2_2"} },
"2list2" => {{"4list3_1", "4list3_2"}, "4element1" } ];
「array」は、「2list1」と「2list2」という名前の 2 つのキーを持つ連想配列です。 各キーの値はリストです。最初のリストは 2 つのリストで構成され、2 番目のリストはリストとデータ要素で構成されます。 各項の先頭の数字は、それらの要素が存在するスタックの深さを示します。 階段の類推では、この要素に到達するために下る必要があるステップの数です。
この場合、スタック モルは次の情報を提供します。

この図は、現在 21 行になっているデータ テーブルの一部のみを示しています。 階層図が完成しました。 データ要素 4list3_2 (太字) にアクセスする場合、パスは次のとおりです。
配列["2list2"][1][2]
以下は、まったく役に立たない並列プロットの例ですが、それでも興味深いパターンが得られます。

プログラムには、分析の単一ステップと再帰の適用方法を説明する多くのコメントがあります。