14

私はここ数ヶ月Jを使用していますが、なじみのないコードを読むこと(たとえば、自分で書いたものではないこと)は、特に暗黙の中で、言語の最も難しい側面の1つであることがわかりました。しばらくして、私はこの戦略を思いつきました:

1)コードセグメントをWord文書にコピーします

2)(1)から各演算子を取り出し、垂直方向に読み取れるように別々の行に配置します

3)各演算子を語彙ページの口頭での説明に置き換えます

4)J構文から英語の文法への大まかな翻訳を行う

5)翻訳を使用して、概念的に関連するコンポーネントを識別し、それらを改行で区切ります

6)(5)の各コンポーネントが何をすることになっているのかを、わかりやすい英語の散文で説明します。

7)(6)に基づいて、プログラム全体が実行することになっていることの説明を書きます。

8)(1)のコードが(7)の設計コンセプトを表していると言える理由を説明してください。

このプロセスから多くのことを学びますが、特に誰かがこれまでに出会ったことのない概念を使用してプログラムを設計した場合は、かなり困難で時間がかかることがわかります。だから私は疑問に思います:Jコミュニティの他の人々はあいまいなコードを理解するための好きな方法を持っていますか?もしそうなら、これらの方法の長所と短所は何ですか?

編集:

分解する必要がある種類のコードの例は次のとおりです。

binconv =: +/@ ((|.@(2^i.@#@])) * ]) @ ((3&#.)^:_1)

私はこれを自分で書いたので、数値入力を受け取り、それを3進配列として再解釈し、結果を2進数の数値の表現として解釈します。(例:binconv 5 =(3 ^ 1)+ 2 *(3 ^ 0)-> 1 2->(2 ^ 1)+ 2 *(2 ^ 0)= 4.)しかし、これがそれが行うことであると理解することは、重要な演習になるでしょう。

4

5 に答える 5

13

ジョーダンの答えに追加したかっただけです。ボックス表示をオンにしていない場合は、この方法で明示的にフォーマットできます。5!:2

   f =. <.@-:@#{/:~
   5!:2 < 'f'
┌───────────────┬─┬──────┐
│┌─────────┬─┬─┐│{│┌──┬─┐│
││┌──┬─┬──┐│@│#││ ││/:│~││
│││&lt;.│@│-:││ │ ││ │└──┴─┘│
││└──┴─┴──┘│ │ ││ │      │
│└─────────┴─┴─┘│ │      │
└───────────────┴─┴──────┘

ツリー表示もあります:

   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
于 2013-10-25T06:01:18.890 に答える
11

最初に動詞をそのコンポーネントに分割してから、それらが何をするかを確認してください。そして、常に語彙を参照するのではなく、データのコンポーネントを試して、それが何をするのかを確認し、それを理解できるかどうかを確認することができます。動詞の構造を確認するには、見ている品詞と、フォークなどの基本的な構造を識別する方法を知ることが役立ちます(もちろん、より大きな暗黙の構造では、括弧で区切ります)。動詞をijxウィンドウに入力し、Enterキーを押すだけで、構造も破壊され、おそらく役立つでしょう。

次の簡単な例を考えてみましょう。<.@-:@#{/:~

私はそれを知って<. -: # {おり/:、すべて動詞で~あり、副詞であり@、接続詞です(語彙の品詞リンクを参照してください)。<.@-:@#したがって、これは左動詞、右動詞/:~、およびダイアドを持つフォーク構造であることがわかります{。これを確認するにはある程度の練習が必要ですが、もっと簡単な方法があります。ijxウィンドウに構造を入力してEnterキーを押すことにより、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について多くを学ぶことができます。文法的な構造を見て、それを理解し、段階的に構築することに集中することをお勧めします(それが最終的に暗黙の動詞を書く方法だからです)。

于 2010-05-05T22:22:55.570 に答える
3

(質問はそのままで十分に長く見えるので、質問を編集する代わりに、これを回答セクションに入れています。)

jsoftwareのWebサイトで、Jordanの回答と質問で説明した方法と組み合わせてうまく機能する優れた論文を見つけました。著者はいくつかの適切な観察を行います:

1)副詞によって修飾された動詞は動詞です。

2)3つ以上の連続する動詞の列は一連のフォークであり、動詞の数に応じて、1つの動詞または左端にフックがあります。

これにより、動詞と副詞を概念単位にグループ化し、ネストされたフォーク構造を使用して演算子のインスタンスが単項か二項かをすばやく判断できるため、暗黙の式を英語に翻訳するプロセスが高速化されます。洗練された方法を使用して行った翻訳の例を次に示します。

d28=: [:+/\{.@],>:@[#(}.-}:)@]%>:@[

[: +/\

{.@] ,

>:@[ #

(}.-}:)@] %

>:@[
  • キャップ(および中置接頭辞)

    (右上の議論の頭)

    (左上の引数をインクリメント)集計

    (斬首マイナス削減)右の議論の上

    で割った

    左上の引数をインクリメント

  • によって定義されたシーケンスの部分和

    正しい議論の最初の項目は、一緒に解き明かされました

    (1つと左の引数)のコピー

    (最初の要素を除くすべて)マイナス(最後の要素を除くすべて)

    正しい議論の

    (1と左の引数)。

  • によって定義されたシーケンスの部分和

    同じ初期点から始めて、

    そして、正しい議論から導き出されたポイントの連続したコピーを追加する

    後続から各先行を減算する

    結果を作成するコピー数で割る

  • yの項目間のx-many値の補間
于 2010-05-23T11:22:15.643 に答える
2

私がどのように読んだかについて話したいだけです:<。@-:@#{/:〜

最初に、それが関数である場合、コマンドラインから(テストのために)次のように入力する必要があることを知っていました

(<。@-:@#{/:〜)

今、私は括弧内のものを見ました。引数のソートされたリストを返す/:〜、リストからアイテムを選択する{、リスト内のアイテムの数を返す#、-:half、<。、floor ...、そしてIそれは中央値かもしれないと考え始めました-リスト内のアイテム数の半分は切り捨てられましたが、#はどのようにしてその引数を取得しましたか?@記号を見て、そこに3つの動詞があることに気づいたので、これはフォークです。リストは右側にあり、ソートされています。次に、左側で、フォークがリストを#に取得して引数の数を取得し、その半分のフロアになっていることがわかりました。これで、実行シーケンスができました。

並べ替えて、出力を正しい引数として中央の動詞に渡します。

リスト内の要素数の半分のフロアを取ると、それが中央の動詞の左引数になります。

真ん中の動詞を実行します。

それが私のアプローチです。フレーズに奇妙なことが多すぎることがあり、それらを調べる必要があることに同意しますが、私は常にJインスタントコマンドラインでこのことを理解しています。

于 2011-11-01T01:39:30.480 に答える
1

個人的には、Jコードを何をするかという観点から考えています。引数の例がないと、すぐに迷子になります。例がある場合、通常、部分式が何をしているのかを簡単に確認できます。

そして、それが難しくなると、それは私が辞書で単語を調べるか、おそらくその文法を研究する必要があることを意味します。

ここで処方箋を読んでみると、これは他の人がその言語を使って作業する方法とそれほど変わらないことがわかります。

たぶん、これを「テスト駆動理解」と呼ぶべきでしょうか?

于 2011-02-24T13:08:31.240 に答える