データスタックに対するパターンマッチ
Erlang ではほとんど関数引数のパターマッチでプログラムが書ける。それを連鎖性言語でやろうとするとデータスタックに対するパターンマッチになる。
Factor だと http://docs.factorcode.org/content/article-locals-examples.html な感じでいろいろできるようではあるが、とりあえず dup 等をそんな感じで実装してみた。
: drop (( _ )) ;
: dup (( X )) X X ;
: swap (( X Y )) Y X ;
: over (( X Y )) X Y X ;
: rot (( X Y Z )) Y Z X ;
: -rot (( X Y Z )) Z X Y ;
: nip (( _ X )) X ;
: tuck (( X Y )) Y X Y ;
わかりやすい。
reverse と map はこんな感じ
: reverse [] swap reverse' ;
: reverse'
(( [] ))
(( Acc [ H T .] )) [ H Acc .] T reverse'
: map [ -rot map' ; # list function -- [ list function
: map'
(( [] _ )) ]
(( [ H T .] F ))
H F call T F map'
そういえば case の書き方をかえたので、いま fib を書くとこうなる。
: fib
= N
N 2 =<
case
true
( 1 )
_
( N 1- fib N 2 - fib + )
;case
;
( ) でブロックというかクオートというかそんなものができる。 Factor の [ ] と同じようなもの。
( 1+ ) 100 swap call .
# => 101
1 10 ( + ) cons call .
# => 11