見出し画像

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;

前回サンプルをもとにどうにか外部ファイルから動くソースを手に入れた。

whl' は while 式ループを実装しています。式は失敗するまで繰り返し評価されます。whl' は末尾再帰を使うループよりも高速であることに注意してください。

制御文はこんな感じ

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)

という表現も別のサンプルで見た。登場する文字は同じだから、たぶんこれは一行インクリメントだと思う。




お願い致します