暗黙のプログラミングは通常、より高速で効率的です。なぜなら、J に自分のやりたいことを正確に伝えることができるからです。しかし、暗黙のプログラミングをこよなく愛する者として、暗黙のプログラミングは J のやり方で物事を考えるように促すとも言えます。
結末を台無しにしてあなたの質問に答えるために: はい、暗黙のプログラミングは構造に関する情報を伝えることができますし、実際に伝えています。技術的には、何よりも意味を強調しますが、遭遇する自明ではない式 (@: & &. ^:
いくつか例を挙げると) で目立つ特徴を持つ演算子の多くは、非常に構造に関連した意味を持っています。
暗黙のコードを書くことの正当性を示す標準的な例は、剰余累乗のための特別なコードであり、同様のショートカットが他にもたくさんあるという保証があります。
ts =: 6!:2, 7!:2@] NB. time and space
100 ts '2 (1e6&| @ ^) 8888x'
2.3356e_5 16640
100 ts '1e6 | 2 ^ 8888x'
0.00787232 8.496e6
もう 1 つの重要な点は、J が明示的な定義を確認すると、適用するたびにそれを解析して評価する必要があるということです。
NB. use rank 0 to apply the verb a large number of times
100 ts 'i (4 : ''x + y + x * y'')"0 i=.i.100 100' NB. naive
0.0136254 404096
100 ts 'i (+ + *)"0 i=.i.100 100' NB. tacit
0.00271868 265728
NB. J is spending the time difference reinterpreting the definition each time
100 ts 'i (4 : ''x (+ + *) y'')"0 i=.i.100 100'
0.0136336 273024
しかし、これらの理由はどちらも、 J が問題を解決する非常に独特なスタイルを持っているという考えには二の足を踏んでいます。いいえ、あります^:
。ループはなく、ランクがあります。同様に、ケンは、微積分では f+g が関数の点ごとの和であるという事実に美しさを見出しました。実際、f+g は (f+g)(x) = f(x) + g( x)—そして、J はすでに点ごとの配列の加算が得意だったのに、なぜそこでやめたのでしょうか?
Haskell のような言語が、高階関数を端から端まで「手動で」同期するのではなく、それらを組み合わせることの喜びを味わうように、J もそうです。意味的に、次の例を見てください。
h =: 3 : '(f y) + g y'
–h
は、その引数 を取得しy
、それをf
およびg
に接続し、結果を合計に注ぎ込む関数です。
h =: f + g
–h
は関数f
との合計ですg
。
(A < B) +. (A = B)
– 「A が B より小さいか、A が B と等しい。」
A (< +. =) B
– 「A は B 以下です。」
それははるかに代数的です。そして、これまでは電車についてしか話してこなかった。^:
やのようなツールの便利さについては、多くのことが言えます&.
。ただし、教訓はかなり明確です。J は、関数を代数的に簡単に説明できるようにしたいと考えています。すべてのアクションを3 :''
orでラップする必要がある場合、または4 :''
さらに悪いことに、別の行に名前を付けなければならない場合は、興味深い形で ( /
or^:
や またはを介して;.
) 適用するたびに、おそらく J から非常に離れてしまうでしょう。
確かに、式が複雑になるにつれて、これほど洗練された例を見つけるのが難しくなることは認めます。暗黙のスタイルには慣れが必要です。語彙は(第二の天性ではないにしても)親しみのあるものでなければなりません。これは、どの言語でも発生する可能性があります。