2D
use strict use Acme::ICFP2006::2D::Parser; my $f = Acme::ICFP2006::2D::Parser->parse("2d/mult.2d"); my $a = 3; my $b = 4; my $ans = $f->{modules}->{mult}->call(toIntExp($a), toIntExp($b)); print $ans->str; sub toIntExp{ my $a = shift; my $str = "Inl " x $a . "Inr ()"; return Acme::ICFP2006::2D::Exp->new($str); }
実行結果
Inl Inl Inl Inl Inl Inl Inl Inl Inl Inl Inl Inl Inr ()
出来た。
ちなみに、mult.2dは、以下の通り。
,..............................|...................................., :plus | : : *==================* | : -->!send [(W,S),(W,E)]!--------#--------------------+ : : *==================* | | : : | | | : : | v v : : | *==============* *============* : : | !case N of S, E!--->!send [(N,E)]!------- : | *==============* *============* : : | | : : | v : : | *========* *================* : : +------------------->!use plus!------>!send [(Inl W,E)]!--- : *========* *================* : ,..................................................................., ,..............................|....................................,
- mult |
- *=================* |
-
- >!send[(W,S),(W,E)]!---------#-------------------+ :
- *=================* v v
- | *==============* *=================*
- | *==============* *=================*
- | |
- v |
- *==========* |
- !split(N,N)!--------------#------------+
- *==========* | |
- | | |
- | v v
- | *========* *========*
- *========* *========*