def, set, get, def_or_set, set_or_def, get_or_def and *_safe

基本のスロット操作であるこれらには省略記法が定められており、それぞれ下記のようになります。


n: 0 //def(:n 0) //第1引数の名に第2引数の値を置く。親のスロットは無関係。定義済みの場合は例外が発生。
n@ 0 //set(:n 0) //第1引数の名に第2引数の値を置く。親のスロットがあればそれに。未定義の場合は例外が発生。
n$ //get(:n) //引数の名の値を返す。親のスロットがあればそれを。未定義の場合は例外が発生。
n:@ 0 //def_or_set(:n 0) //defに失敗したらsetする。
n@: 0 //set_or_def(:n 0) //setに失敗したらdefする。
n$: 0 //get_or_def(:n 0) //getに失敗したらdefする。
n:* 0 //def_safe(:n 0) //例外の飛ばないdef
n@* 0 //set_safe(:n 0) //例外の飛ばないset
n$* //get_safe(:n) //例外の飛ばないget
n:@* 0 //def_or_set_safe(:n 0) //例外の飛ばないdef_or_set
n@:* 0 //set_or_def_safe(:n 0) //例外の飛ばないset_or_def
n$:* 0 //get_or_def_safe(:n 0) //例外の飛ばないget_or_def
defとsetは、スロットの持ち主のインスタンスがconstである場合も例外発生となります。

10.++: `[] //10はリテラルなのでconstであり、エラー。
n: 10.copy
n.++: `[] //nが参照するオブジェクトのスロットの++がdefされる。Int.++は無変化。
n2: 10.copy
n2.++@ `[] //n2.++は親のIntのものなので、これはInt.++がsetされる。これで全てのIntの子供が++できなくなる。
n2.++@ n2.--$ //Int.++がInt.--と同じものを参照するようになる。
引数を取る省略記法は、その次にくる式をひとつ消費し、それを引数とします。

n: 0 //def(:n 0)
n: 'str'.reverse //def(:n 'str'.reverse)
def_or_setは、"定義済みであろうとなかろうと定義する"ということです。先にdefを行うため、親のスロットに定義済みかどうかは意味を成しません。
set_or_defは、これも"定義済みであろうとなかろうと定義する"ということですが、こちらは親のスロットに定義されていればそれを書き換えることになります。
get_or_defは、"定義済みの場合には定義しない"ということであり、このことからデフォルト定義というものを実行できます。