💎Bracmat入門#1 四則演算だがしかし 減算と除算が標準装備されてないだと…

Bracmatはもともと記号代数の計算機として開発されました。テーブル電卓と同様に、Read Eval Print Loop (REPL)を実行します。足し算、掛け算、累乗、累乗、対数、代数式の微分を行います。

となってるが、安心しちゃいけないぜ、みんな

減算(-)や除算(/)の演算子はありません.

この言語、だいぶ訳ありみたいだな、、、

他の代数システムに比べて、Bracmatには内蔵されている機能が少なく、数学演算子のセットも少ない。例えば,減算や除算の演算子はありません.しかし,Bracmatは一般的で柔軟性に富み,計算機代数の分野以外の問題でもエレガントに解くことができます.

実際評価してみた ?の行が入力、ビックリマークの行が評価結果だと思いネエ

{?} 1+1
{!} 2
   S   0,00 sec  (3968.3987)
{?} 2*2
{!} 4
   S   0,00 sec  (3968.3987)
{?} 4/2
{!} 4/2
   S   0,00 sec  (3968.3987)
{?} 4-1
{!} 4-1
   S   0,00 sec  (3968.3987)

ほ、ほんまや。。。。

減算と除算は足し算と掛け算の特殊な形式として扱われます。したがって、減算と除算には二進演算子はありません。(ただし、マイナス記号-とスラッシュ/は数の中で使用できます)。

クレイジー

減算、マイナス演算子ないので、マイナスどうしを加算で!

{?} -1+-1
{!} -2
   S   0,00 sec  (3994.4032)

そうなんです、

除算、除算演算子つかえないかわりに、分数で乗算してください!!

{?} 3*1/3
{!} 1
   S   0,00 sec  (3994.4032)

そうなんです、小学校思い出しますね!!なんなんだよこれ

なんで、こんなに面倒くさいの??

理由はいくつかあると思います。予想も含みですが

パターンマッチングの記号とかぶる
文字列の連結との相性(結合法則的なやつ?)
(上と似てるかもだが)4つの評価コンテキストとの相性

悪いことばかりじゃないよ面白いこともあるよ

代数的な式を、俺ルールみたいな書式でまとめてくれます。例をいくつかのせます。

{?} x^2*x^4
{!} x^6
   S   0,00 sec  (3996.4032)
{?} x*x*x*2
{!} 2*x^3
   S   0,00 sec  (3998.4032)

ある法則にしたがって式をまとめてくれるようです。また彼らは「そういうことがしたい」ということのようでした。なんかすげー

ちょっと先の事 関数

サンプルにあった、2乗を求める関数の書き方です。

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

ドルやら点やらビックリマークやら、記号の特殊さは慣れましょう。javascriptのように=でsquareに対して計算のアサイン(割り当て)をしています。内容はもらった引数(これもargという決めがあって、javascriptのargumentsに似た仕組みです)を!で評価して返すというもので、{}の中身は何とびっくり、コメントで、いくらでもかけます。

実際の評価ではsquare$で引数をここでは5を渡して数が戻ってきます。

宣言中にある.(dot)と呼び出し時の$は別で時間をつかったほうがよく。とりあえずは上の方法だといわゆるjavascriptで慣れている関数言語っぽい関数の定義と呼び出しはできると思ってください。

まとめ

パターンマッチングがとにかく強力で、そのためにいわゆる構造化ー>オブジェクト指向で進化したプログラミング言語では見慣れない表現が多くあるみたいです。仕事でちょうどこのような言語があると便利だと思った案件があるので、もう少し調べていきたいと思います。

WSLで準備した途中と、Winでバイナリ使った例をのせました。WSLもgccデコンパイルして動かせるようになっています。




お願い致します