私は J の初心者なので、この言語を使用して簡単なタスクを解決することにしました。特に、バブルソート アルゴリズムの実装です。関数型言語でこの種の問題を解決するのは慣用的ではないことを私は知っています.Cのような命令型言語では、宣言型言語で変更されたリストを構築するのではなく、配列要素の転置を使用して自然に解決されるためです。ただし、これは私が書いたコードです:
(((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: #
ステートメントの構造は次のとおりです。
┌────────────────────────────────────────────────────────────────────────────┬──┬─┐
│┌───────────────────────────────────────────────────────────────┬──┬───────┐│^:│#│
││┌───────────────────┬─┬───────────────────────────────────────┐│^:│┌─┬─┬─┐││ │ │
│││┌──────┬─┬────────┐│,│┌──┬─┬────────────────────────────────┐││ ││1│<│#│││ │ │
││││┌──┬─┐│@│┌─┬─┬──┐││ ││$:│@│┌───────────────────┬─┬────────┐│││ │└─┴─┴─┘││ │ │
│││││<.│/││ ││2│&│{.│││ ││ │ ││┌──────┬─┬────────┐│,│┌─┬─┬──┐││││ │ ││ │ │
││││└──┴─┘│ │└─┴─┴──┘││ ││ │ │││┌──┬─┐│@│┌─┬─┬──┐││ ││2│&│}.│││││ │ ││ │ │
│││└──────┴─┴────────┘│ ││ │ ││││>.│/││ ││2│&│{.│││ │└─┴─┴──┘││││ │ ││ │ │
│││ │ ││ │ │││└──┴─┘│ │└─┴─┴──┘││ │ ││││ │ ││ │ │
│││ │ ││ │ ││└──────┴─┴────────┘│ │ ││││ │ ││ │ │
│││ │ ││ │ │└───────────────────┴─┴────────┘│││ │ ││ │ │
│││ │ │└──┴─┴────────────────────────────────┘││ │ ││ │ │
││└───────────────────┴─┴───────────────────────────────────────┘│ │ ││ │ │
│└───────────────────────────────────────────────────────────────┴──┴───────┘│ │ │
└────────────────────────────────────────────────────────────────────────────┴──┴─┘
それを配列に適用しましょう:
(((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: # 5 3 8 7 2
2 3 5 7 8
私を混乱させるのは$:
、最も外側の括弧内のステートメントを参照することです。ヘルプは次のように述べています。
$:
それを含む最長の動詞を示します。
別の本(~ 300 KiB) には次 のように書かれています。
3+4
7
5*20
100
上記のフレーズのプラスや 時間を表す+ や * などの記号は動詞と呼ばれ、機能を表します。J 句に複数の動詞が含まれる場合があります。その場合、単純な英語の文のように、 を左から右に読むことで構成され ます。
4+6%2
4
6
2
()
最も外側の sを省略してコード スニペットを書き直してみましょう。
((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) ^: # 5 3 8 7 2
2 3 5 7 8
結果は同じです。なぜこれが機能するのか、なぜ only が最長の動詞として扱われるのか、式全体ではなく、 だけではないのか、説明でき((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
ません$:
でし((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) ^: #
た(<./@(2&{.)), $:@((>./@(2&{.)),2&}.)
。動詞としての文 (最初のスニペット)。おそらく、1 つの接続詞によって制限される動詞の長さには、何らかの制限があります。((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
#
次のコードを見てください (ここから):
factorial =: (* factorial@<:) ^: (1&<)
factorial 4
24
factorial
within 式は、関数全体、つまり(* factorial@<:) ^: (1&<)
.
この例に従って、代わりに関数名を使用しました$:
:
bubblesort =: (((<./@(2&{.)), bubblesort@((>./@(2&{.)),2&}.)) ^: (1<#)) ^: #
bubblesort 5 3 8 7 2
2 3 5 7 8
関数全体を参照することを期待bubblesort
していましたが、結果が正しいため、そうではないようです。
また、他の実装がある場合は、少しリファクタリングしたものでも見てみたいと思います。
ありがとう。