2014/06/22

データスタックに対するパターンマッチ

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

0 件のコメント: