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
ということになる。