言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

イコールとリストの表現

Oz のイコールは普通の代入でも同値検査でも無い。

local X Y in 
   f(X b) = f(a Y)
   {Show [X Y]}
end
  • local はスコープの始まりを表す。scheme で言う所の let。
  • ラベル(キー: 値 キー: 値) は構造体のようなもの。キーを省略した場合、PHP のように 1, 2, ... と番号付けられる。
  • 小文字で始まるのはシンボル。大文字で始まると変数。
  • 変数は一度しか代入(定義)出来ない。
  • イコールによって、両辺はマージされる。変数があれば定義される。
  • 上手くマージできなければ失敗する。

と言う事で、イコールによって X = a, Y = b となり
[a b] が表示される。

local Z in 
   f(Z a) = Z
   {Browse Z}
end

これはもっと面白い例。Z が Z によって無限に定義される。
両辺をひっくり返したり、Z と a の順番を変えてもそれなりに期待する動作をします。

リストを表す方法はいくつもある。

{Browse [1 2 3]}
{Browse 1|2|3|nil}
{Browse '|'(1 '|'(2 '|'(3 nil)))}
{Browse '|'(1 '|'(2 '|'(1:3 2:nil)))}

% このイコールの使い方は良く分からない。。。
{Browse [1 2 3] == '|'(1 '|'(2 '|'(1:3 2:nil)))}
  • [a b] はリスト
  • a|b|nil もリスト
  • '|'(a '|'(b nil)) もリスト(前置記法)
  • (a b) と (1:a 2:b) は同じ配列