2014/07/06

ren ジェネリックワード(ファンクション)

ren に Clojure のマルチメソッドみたなものを実装してみた。

:g length dup type-of ;
:m length (( list )) erlang:length/1 ;
:m length (( tuple )) erlang:size/1 ;
:m length (( binary )) erlang:size/1 ;
:m length (( map )) erlang:map_size/1 ;

:g でジェネリックファンクションを定義する。やってることはスタックトップのオブジェクトのタイプをスタックにつむだけ。 :m でメソッドを定義する。スタックトップにつまれたタイプでパターマッチングしている。

Erlang にもマップが導入された。それを使ってこんなふうに OO っぽいことをやってみた。継承をどうするかが悩ましい。

:g + over type-of over type-of ;     # x y -- x y type-of-x type-of-y
:m + (( integer _ )) erlang:+/2 ;
:m + (( float _ )) erlang:+/2 ;
:m + (( list list )) erlang:++/2 ;
: point{ ( 'point >typed-map ) '{ ;
:m + (( #{ x X1 y Y1 } #{ x X2 y Y2 } point point ))
point{ 'x X1 X2 + 'y Y1 Y2 + }
;

point{ 'x 1 'y 2 } point{ 'x 3 'y 4 } +
# => #{'-type-' => point,x => 4,y => 6} Erlang の出力のまま

0 件のコメント: