Bracmat入門#3 外部ファイルからプログラム実行とそこで使われているビルトインの関数などについて
{ myprog }
(square=.!arg^2 {definition})
(test=
0:?N
& whl
' ( arg$:?argument
& out$(square$ !argument)
)
& whl
' ( arg$!N:?argument
& out$(hello !N is !argument)
& 1+!N:?N
)
);
!test;
前回サンプルをもとにどうにか外部ファイルから動くソースを手に入れた。
制御文はこんな感じ
WHILE a DO b;
whl'(!a&`!b)
DO b WHILE a;
whl'(`!b&!a)
DO b UNTIL a;
whl'(`!b&~!a)
FOR i := m TO n DO b;
!m+-1:?i&whl'(1+!i:~>!n:?i&`!b);
expressionががそのままconditionにもbodyにもなっている。同じ関数でもRHS(右辺)の評価をするしないを二項演算子で決められるようになっている。
$と'の評価
str'(b+a):"b+a"
str$(b+a):"a+b"
’の場合は評価しないので、そのままb+aを文字列に変える関数になる。$の場合はb+aを評価してから文字列に変える。つねに1手位手前にくるかんじで評価がされているきがする。
想定コマンド
関数の組み合わせだが、宣言も制御も書けるよ的なアピールが地味にされている。
Selection:
{IF a THEN b ELSE c;}
!a&`!b|!c;
{v := IF a THEN b ELSE c;}
(!a&`!b|`!c):?v (works even if !c fails)
{SELECT a WHEN c1 : b1 WHEN c2 : b2 OTHERWISE bx;}
!a:(!c1&`!b1|!c2&`!b2|?&!bx);
conditionでなくselectionというくくりでIF分とSELECTが並ぶ
シェルでいうところの「$」のかわりに「!」
変数の宣言後に使うときに冒頭に$を入れる感じで、顕在化したいキーワードについては冒頭に!マークを付ける。
out$(hello !N is !argument)
構造型ーオブジェクトが採用している文字リテラルがないので、そこで一手手前な感じがするのかもしれない。感覚としてはrubyとかの式展開が一文字の接頭辞でできるようになっている印象。actionscriptでこういう使い心地は前にあったが、ここまでまじめにやろうと思った言語はいまだかつてあったか。
構造、宣言、範囲の概括、文字リテラルの革命あるものの、インクリメントとか制御的な見通しが少し悪いかも。。。
なれるしかないだろうが
FOR i := m TO n DO b;
!m+-1:?i&whl'(1+!i:~>!n:?i&`!b);
まだ読みこなせてないが、インクリメントが数字先に来る感じになっているようだ。
(1+!linenr:?linenr)
という表現も別のサンプルで見た。登場する文字は同じだから、たぶんこれは一行インクリメントだと思う。
いいなと思ったら応援しよう!
お願い致します