質問
私は数ヶ月間Jを使用していますが、なじみのないコードを読むこと(たとえば、私が自分自身を書いていないこと)は、特にそれが暗黙のとき、言語の最も挑戦的な側面の1つであることがわかります。しばらくして、私はこの戦略を思いつきました:
1)コードセグメントを単語文書にコピーする
2)(1)から各オペレーターを取り、それを別の行に置き、垂直に読み取るようにします
3)各オペレーターを語彙ページで口頭で説明します
4)J Syntaxから英語の文法への大まかな翻訳を行う
5)翻訳を使用して概念的に関連するコンポーネントを識別し、ラインブレークで分離します
6)(5)からの各コンポーネントが何をするべきかについての説明を書く、平易な英語の散文で
7)(6)に基づいて、プログラム全体がすべきことの説明を書く
8)(1)からのコードが(7)の設計概念を表すと言える理由の説明を書く。
私はこのプロセスから多くを学びますが、私はそれがかなり困難で時間がかかります - 特に誰かが私がこれまでに遭遇したことのないコンセプトを使用して自分のプログラムを設計した場合。だから、Jコミュニティの他の人は、あいまいなコードを理解するお気に入りの方法を持っていますか?もしそうなら、これらの方法の利点と短所は何ですか?
編集:
分解する必要があるコードの種類の例は、次のとおりです。
binconv =: +/@ ((|.@(2^i.@#@])) * ]) @ ((3&#.)^:_1)
私はこれを自分で書いたので、たまたま数値入力が必要であり、それを三元アレイとして再解釈し、最大1つの複製でベース2の数の表現として結果を解釈します。 (例、binconv 5 =(3^1)+2*(3^0) - > 1 2->(2^1)+2*(2^0)= 4.)これがそれが行うことであることを理解している以前の歴史や文書化。
解決
最初に動詞をそのコンポーネントに分解してから、それらが何をしているかを確認してください。そして、常に語彙について言及するのではなく、データ上のコンポーネントを試して、それが何をしているのかを確認し、それを理解できるかどうかを確認することができます。動詞の構造を見るために、あなたが見ているスピーチの部分と、フォークのような基本的な構造をどのように識別するかを知るのに役立ちます(そしてもちろん、括弧によって分離されたより大きな暗黙の構造で)。動詞をijxウィンドウに入力してEnterを押すだけで、構造も破壊され、おそらく役立ちます。
次の簡単な例を考えてみましょう。 <.@-:@#{/:~
そんなこと知ってる <.
-:
#
{
と /:
すべて動詞です、 ~
副詞です @
接続詞です(音声のスピーチリンクの部分を参照)。したがって、これは左動詞のあるフォーク構造であることがわかります <.@-:@#
、右動詞 /:~
、そしてダイアド {
。これにはいくつかの練習が必要ですが、簡単な方法があります。JXウィンドウに入力してEnterを押すことで、Jをjに表示してください。
<.@-:@#{/:~
+---------------+-+------+
|+---------+-+-+|{|+--+-+|
||+--+-+--+|@|#|| ||/:|~||
|||<.|@|-:|| | || |+--+-+|
||+--+-+--+| | || | |
|+---------+-+-+| | |
+---------------+-+------+
ここでは、動詞の構造を見ることができます(または、これらを見ることに慣れた後にできるようになります)。次に、ピースを識別できない場合は、それらと一緒に遊んで、彼らが何をしているのかを確認してください。
10?20
15 10 18 7 17 12 19 16 4 2
/:~ 10?20
1 4 6 7 8 10 11 15 17 19
<.@-:@# 10?20
5
それらをさらに分解し、必要に応じて実験してそれらを理解することができます(この小さな例は中央の動詞です)。
Jは多くのコードを数文字に詰め込んでおり、大きな暗黙の動詞は、経験豊富なユーザーにとっても非常に威圧的に見えることがあります。実験はドキュメント方法よりも速くなり、大きな複雑な動詞を分解しようとすることで、Jについて多くのことを学ぶことができます。文法構造を見て、ピースを把握し、段階的に構築することに焦点を当てることをお勧めします(最終的には暗黙の動詞を書く方法だからです)。
他のヒント
追加したかっただけです ヨルダンの答え :ボックスディスプレイがオンになっていない場合は、この方法で明示的にフォーマットできます 5!:2
f =. <.@-:@#{/:~
5!:2 < 'f'
┌───────────────┬─┬──────┐
│┌─────────┬─┬─┐│{│┌──┬─┐│
││┌──┬─┬──┐│@│#││ ││/:│~││
│││<.│@│-:││ │ ││ │└──┴─┘│
││└──┴─┴──┘│ │ ││ │ │
│└─────────┴─┴─┘│ │ │
└───────────────┴─┴──────┘
ツリーディスプレイもあります:
5!:4 <'f'
┌─ <.
┌─ @ ─┴─ -:
┌─ @ ─┴─ #
──┼─ {
└─ ~ ─── /:
語彙ページを参照してください 5!:表現 そしてまた 9!:グローバルパラメーター デフォルトを変更するため。
また、それが価値があることについては、Jを読むための私自身のアプローチは、表現を手作業で再タイプし、それを右から左に構築し、私が行くときにピースを調べ、アイデンティティ関数を使用して必要なときに一時的な列車を形成することでしたに。
したがって、例:
/:~ i.5
0 1 2 3 4
NB. That didn't tell me anything
/:~ 'hello'
ehllo
NB. Okay, so it sorts. Let's try it as a train:
[ { /:~ 'hello'
┌─────┐
│ehllo│
└─────┘
NB. Whoops. I meant a train:
([ { /:~) 'hello'
|domain error
| ([{/:~)'hello'
NB. Not helpful, but the dictionary says
NB. "{" ("From") wants a number on the left.
(0: { /:~) 'hello'
e
(1: { /:~) 'hello'
h
NB. Okay, it's selecting an item from the sorted list.
NB. So f is taking the ( <. @ -: @ # )th item, whatever that means...
<. -: # 'hello'
2
NB. ??!?....No idea. Let's look up the words in the dictionary.
NB. Okay, so it's the floor (<.) of half (-:) the length (#)
NB. So the whole phrase selects an item halfway through the list.
NB. Let's test to make sure.
f 'radar' NB. should return 'd'
d
NB. Yay!
補遺:
NB. just to be clear:
f 'drara' NB. should also return 'd' because it sorts first
d
(質問を編集する代わりに、これを回答セクションに入れています。質問はそのままで十分に長く見えるからです。)
私はちょうど素晴らしい紙を見つけました jsoftwareのウェブサイト それは、ヨルダンの答えと質問で説明した方法と組み合わせてうまく機能します。著者はいくつかの適切な観察を行います:
1)副詞によって変更された動詞は動詞です。
2)3つ以上の連続した動詞の列は、一連のフォークであり、動詞の数に応じて、左側の左側に単一の動詞またはフックがある場合があります。
これにより、暗黙の式を英語に変換するプロセスが高速化されます。動詞と副詞を概念ユニットにグループ化し、ネストされたフォーク構造を使用して、オペレーターのインスタンスがモナディックかダイアディックかを迅速に判断できるためです。洗練された方法を使用して行った翻訳の例は次のとおりです。
d28=: [:+/\{.@],>:@[#(}.-}:)@]%>:@[
[: +/\
{.@] ,
>:@[ #
(}.-}:)@] %
>:@[
キャップ(プラスインフックスプレフィックス)
(右の引数の上に頭)ラベル
(左の引数の上の増分)集計
(斬首を差し引いた削減)右の引数の上
で割った
左引数の上部で増加します
で定義されたシーケンスの部分的合計
正しい議論の最初の項目は、一緒にraveしました
(1つに加えて左の引数)のコピー
(最初の要素を除くすべて)マイナス(最後の要素を除くすべて)
正しい議論の
(1つに加えて左の引数)。
で定義されたシーケンスの部分的合計
同じ最初のポイントから始めて、
そして、正しい議論から派生したポイントの連続コピーを追加します
後継者から各前身を減算します
結果を作成するコピーの数で割る
- Yのアイテム間のX-Many値を補間します
個人的に、私はそれが何をするかという点でJコードを考えています - 引数の例がない場合、私は急速に迷子になります。例がある場合、通常、サブ発現が何をしているのかを見るのは簡単です。
そして、それが難しくなったら、それは辞書で単語を調べるか、おそらくその文法を研究する必要があることを意味します。
ここで処方箋を読んで、私はこれが他の人が言語でどのように働くかとそれほど違いはないという考えを得ています。
たぶん、私たちはこれを「テスト駆動型の理解」と呼ぶべきですか?
私は自分の読み方について話したいだけです:<。@ - :@#{/:〜
まず、コマンドラインから関数であれば、(テストのために)入力する必要があることを知っていました。
(<.@-:@#{/:~)
今、私は括弧内のものを見ました。私はA /:〜を見ました。これは、その引数の並べ替えられたリストを返します。{リストからアイテムを選択します。#は、リスト内のアイテムの数を返します。中央値である可能性があると考え始めました。リスト内のアイテムの数の半分が丸みを帯びていますが、#はどのように議論を受けましたか?私は @サインを見ました - そして、そこに3つの動詞があることに気付きました - これはフォークです。リストは右側にあり、ソートされ、左側では、フォークが#にリストを取得して引数の数を取得し、その半分のフロアがかかることを知っていました。これで、実行シーケンスがあります。
並べ替え、正しい引数として出力を中央の動詞に渡します。
リスト内の要素の数の半分の床を取り、それが中央の動詞の左の引数になります。
中央の動詞を実行します。
それが私のアプローチです。フレーズには奇妙なものが多すぎることがあり、それらを調べる必要があることに同意しますが、私はいつもJインスタントコマンドラインでこのことを考えています。