Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

combinator

Factorでコードを書く上でのTipsも紹介していきます
今回はcombinator

0.91の時点でのhttp vocabularyにはassoc>queryがない。
なので自前でこんなのを書いていた。

: >query ( assoc -- str )
[
url-encode
2array
"=" join
] { } assoc>map
"&" join ;

まあこれでも動くんだけど2arrayで一時配列を使ったりしてるの無駄がある。
最新版のhttp vocabularyではこうなっている。

: assoc>query ( hash -- str )
[
[ url-encode ]
[ dup number? [ number>string ] when url-encode ]
bi*
"=" swap 3append
] { } assoc>map
"&" join ;

3appendとか速いのか遅いのかわからんけでも一時配列を使わない分効率が良い。
(僕のはstring前提で書いてるのでnumber>stringはいってない)
最初これを見たときはぁ?と思ったけど、要は関数合成、実行をやっている。
bi*は関数合成を行うwordでcombinators.cleaveにいる。
最新ではもうkernelにマージされてしまっているが。

関数合成を使ってスッキリ書くのがFactor厨への第一歩だ。

とりあえず

  1. bi
  2. bi*

ぐらいは知っておくに越したことはないと思う。
combinatorの説明はめんどいのでドキュメントに出てるはずなので読んでください。

一応簡単に書くとbi*は

: bi* ( x y p q -- )
>r swap >r call r> r> call ; inline

こーいうことをやっている。
(slipも展開している)
合成、遅延系では>r r>を使うパターンになるのでこの辺は身につけておくといい。
(keep,slip系)
次回は0.91以降の新機能であるfryの使い方をやる予定。