2023 03 17 - qnighy/umo GitHub Wiki
近況
さくっとパーサーを作って、Hello, worldができるようになった。 https://github.com/qnighy/umo/commit/da09cea14ade8f40190f4e59d73b32e650892160
ドット記法について
x.foo()
のようなドット記法は現代のプログラミング言語ではやはり備えておきたいところ。しかしこれの実装方針には大きく以下の4通りが考えられる。
- 解決方法
- レシーバ相対
- 静的
- 名前の同一性
- 文字列一致 (structural)
- 宣言位置が一致 (nominal)
多くのドット記法はレシーバ相対で解決される。つまり、レシーバが何であるかに依存して異なる実体になる可能性がある。たとえばRustの場合、 x.map()
が何であるかは x
が何であるかに依存し、アドホックな解決が必要になる。これはトレイトのような抽象化機構で抽象化できないので、色々面倒な結果や予測できない結果のもとになってしまう。
静的に解決されるものは .
以外の記法によって導入されていることが多い。たとえばいくつかの言語にあるパイプライン演算子 |>
はこれに近い。
名前の同一性は、ドット記法をインターフェースとして使うときに違いが出てくる。Goはメソッド名が同じであればそれをinterfaceの実装とみなすようになっているが、Rustではメソッド名が同じかどうかだけではなく、陽に特定のtraitの実装であることを宣言する必要があるので、nominalな同一性を持っているものとみなせる。
それぞれのpros/consを個人的な観点からリストしてみる。
- 解決方法
- レシーバ相対
- 利点: 同じメソッド名を色々な用途で使っても不都合がない
- 欠点: アドホックな解決により予期しない非互換性や予測が難しい挙動が発生する
- 静的
- 利点: 安定的に解決される
- 欠点: 異なる実体が同じメソッド名を共有するとユーザー側でrenameする必要が出てきてしまう
- レシーバ相対
- 名前の同一性
- 文字列一致 (structural)
- 利点: conciseでわかりやすい
- 欠点: 異なるインターフェースが同名のメソッドを要求したときにどん詰まりになることがある
- 宣言位置が一致 (nominal)
- 利点: 異なるインターフェースが同名のメソッドを要求したときにどん詰まりになるようなパターンが起きない
- 欠点: 冗長でモデルの理解にやや難がある
- 文字列一致 (structural)
これらを踏まえて、nominalで静的解決されるドット記法が一番安定的で良いのではないかと考えているが、それによって発生しそうな取り回しの悪さをどうするべきかには課題が残る。