smlnjの中値演算子のやつ

タイガーブックやってたら、中値演算子を定義するものが見つかったので、試してみた。

Standard ML of New Jersey v110.85 [built: Sat Dec 22 16:51:02 2018]
- (* 演算子 plus を定義 *)
- infix 6 plus;
infix 6 plus
- (* 演算子 plus2 を定義 *)
- infix 8 plus2;
infix 8 plus2
- (* 演算子の振る舞いの定義 *)
- fun x plus y = x + y;
val plus = fn : int * int -> int
- fun x plus2 y = x + y;
val plus2 = fn : int * int -> int
- 2 * 3 plus 4;
val it = 10 : int
- 2 * 3 plus2 4;
val it = 14 : int

plus2は*(結合度6)よりも高く設定してあるので、2 * 3 plus2 4 は2 * (3 + 4)として計算される。infixは左結合の演算子の定義らしいので、右結合の場合は、infixrを使えばいいみたい。右結合というのは、例えば、a = b = c;という文があった場合、多くの言語でb = cが先に実行されるでしょう?それ。

- (* 仮の代入演算子 equal の設定 *);
- infixr 4 equal;
infixr 4 equal
- fun a equal b = (
= print (a^"に"^b^"を代入したとする\n");
= b);
- "a" equal "b" equal "c" equal "3";
cに3を代入したとする
bに3を代入したとする
aに3を代入したとする
val it = "3" : string
- (* 左結合バージョン *)
- infix 4 equal2;
infix 4 equal2
- fun x equal2 y = (
= print (x^"から"^y^"\n");
= x);
val equal2 = fn : string * string -> string
- "2" equal2 "a" equal2 "b";
2からa
2からb
val it = "2" : string

ということになる。