見出し画像

Bracmat入門#2 関数の操作あたりから少しづつアサインメントになれる

Bracmatは自分にとって木構造と仲良くなれる最後のチャンスなのかもしれない。。。

前回からの続き

最後に関数を少し動かしてみた。言語仕様とかサンプルというよりも、運用するにあたり当然必要そうな操作から調べて仕様を結び付けておく。

{?} square=.!arg^2 {definition}
{!} square
  S   0,00 sec  (4000.4032)
{?} square$5            {call}
{!} 25
  S   0,00 sec  (4000.4032)

実際他の引数入れるとどうかというと、helloとかいれるとこんなんなる。

{?} square$hello
{!} hello^2
   S   0,00 sec  (4001.4032)

期待感しか持てないこの結果。評価についてはゆっくり覚えるとして、suare関数の宣言を見たいときはどうしたらいいのだろうか?名前だけ呼び出しても何も起こらない。

{?} square
{!} square
   S   0,00 sec  (4000.4032)

ここで単項演算子 と呼ばれているエクスクラメーションマークが登場する。rubyでは破壊マークとして知られているものだ。

他のプログラミング言語とは異なり、Bracmatは変数やオブジェクトメンバの名前を入力しても値を返しません。(ばーん)

Bracmatでは、変数やオブジェクトメンバには名前ではなく、その値が欲しいということを明示的に伝える必要があります。
これは、変数名やオブジェクトメンバ名の前に接頭辞「!」や「!!」をつけることで実現します。

{?} !square
{!} .!arg^2
   S   0,00 sec  (4002.4032)

中身みれた。そうすると、javascriptみたいにああもこうも代入できそうか試してみるが、根本的にアサインメントの考えが違うみたいなので、少し遠回りしたほうがよさそう。

まだよくからないが、win64でしか確認できませんでした

ので、以下win64限定っす

Bracmatが任意の引数(argc > 1)で開始された場合、引数がarg$の呼び出しによって消費されない限り、すべての引数は左から右に評価されます。

とりあえず、以下のソースがサンプルで載っていたので、動かしたら何とか動いた。

   { myprog }
  (test=
    0:?N
  &   whl
    ' ( arg$:?argument
      & out$(The next argument is !argument)
      )
  &   whl
    ' ( arg$!N:?argument
      & out$(Argument !N is !argument)
      & 1+!N:?N
      )
  );
  !test;

最後の行でtestを自己評価しているので、ちゃんとファイルが呼び出されて、引数を表示することができた。できたと書くが、ちょっとまだ引数の扱い含み確証がもてないので、ソースもよんだほうがいいみたい。

とりあえず、外部ファイルにソース書いて、動いた

引数の部分がまだ読み慣れていないので、最後の引数が出てくれる部分にSquareを呼び出すようにした。

   { 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;

コマンドはこんな感じで呼び出している。これでいろいろ実験できそうだ。

bracmat64 "get$@\"myprog2.bra\"" 5

結果はこんな感じで出る 

25
hello 0 is bracmat64
hello 1 is get$@"myprog2.bra"
hello 2 is 5

まずは引数の部分をもう少し整理して、組み込み関数の主要なところを読み込んで、アサインメントの理解に到達したい。




お願い致します