昨夜は試験前日ということで学校で泊まりこみで学科の人たちの勉強をしていた. なのだけどJ言語という面白いのを知ってしまった.APLなら聞いたことはあったけれど (SRFI-1のiotaの由来がある言語だ)それの後継であるらしい.
この言語では関数とか演算子のことを動詞と呼ぶらしいのだけれど、単項か二項の動詞しか なくて、引数が3つ以上の関数に相当するものがどうしても作れないのだけれど.
部分適用はあるけど、ラムダ抽象がないので、引数を増やす方法ができない. リストを渡せる場合ならいいけれど.
a -> b
な演算子があるとき、 a
のリストまたは行列をその演算子に渡すと勝手にmapしてくれる.,
が append か cons になる再帰爆発するやつ
fib =: 3 : 'if. y <: 1 do. y else. (fib y-1) + (fib y-2) end.'
fib 1
1
fib 2
1
fib 2
1
fib 3
2
fib 4
3
fib 1 2 3 4 5
1 2 3 4 5
リスト渡してmapしてくれない. なにゆえ
線形時間で終わるタイプの再帰呼び出し
next
3 : '(1{y) , (+/ y)' NB. [a,b] => [b,a+b]
fib2
4 : 'if. x=0 do. (0{y) else. (x-1) fib2 (next y) end.'
fib
3 : 'y fib2 0 1'
fib 2
1
fib 3
2
fib 4
3
fib 5
5
fib i.10
0
wtf!?
上の奇妙に見える動作は不取敢,理由はわかった 自分で定義したfibは配列を受け取っても正しく動作してしまうのである
1 2 3 4 <: 1
1 1 1 1
これは map (<= 1) [1,2,3,4]
if. 1 1 1 1 do. ...
これは配列の0-thだけでtrue/falseの判断をするらしいので,今はtrue
引数に何を来ることにするかくらい,どっかに書かせてほしい ゆるゆるな動的型付けもびっくりな仕様だ
rankという概念がここで役立つそうだ つまり,適用させる引数がスカラーか,n次の行列かを直接適用する際に書ける
fib"0 (i.10)
0 1 1 2 3 5 8 13 21 34
出来た "0
は適用されるのがスカラーであることを意味する
というか,メモ化の為の演算子(本当,なんでも用意されている!)の説明のページ
http://www.jsoftware.com/help/dictionary/dmcapdot.htm
にフィボナッチの例があるのでこれを見るのが良いです