抽出オペレータ ~
- http://github.com/okuoku/nmosh-staging/blob/5690f617a6b40cbb4c7cb85ed88c9eade40f6e2c/lib/nmosh/ref.nmosh.ss
- http://github.com/okuoku/nmosh-staging/blob/5690f617a6b40cbb4c7cb85ed88c9eade40f6e2c/lib/nmosh/table.nmosh.ss
新しい構文 ~ を導入。これはGaucheの ~ ( http://blog.practical-scheme.net/gauche/20100428-shorter-names )を参考にしているが、nmoshにはネイティブのオブジェクトシステムが無いので一段階抽象化(nmosh miniobj)した。
Gaucheの~との違いで重要なのは、nmoshの ~ は代入まで面倒を見ないといけない点。
Cで次のように書ける操作を考える。
tbl.hoge = fuga;
Gauheでは、set!はSRFI-17としても機能するので、
(set! (~ tbl 'hoge) fuga)
のように書ける。
nmoshの抽出オペレータでは、set!は使えないので、オペレータ内に書く必要がある。
(~ tbl 'hoge := fuga)
今回は、代入操作のために := を操作子として予約した。
R6RSのvariable transformerは特定の構文オブジェクトに関連付ける必要があるため、この目的には使えない。
nmoshでは全てのOOP風操作をこの~オペレータに集約しようと考えている。例えば、メソッドの呼び出しを ! で行うと約束すれば、
(~ obj 'slot ! 'method)
は、
(apply (~ obj 'method) (~ obj 'slot))
のような構文として定義できる。