スポンサーリンク

コードが書ける!数式が書ける!AAが書ける!スタンプが貼れる!

無料の匿名掲示板型SNS「このはちゃんねる

新規会員募集中!

抽象オブジェクトは使い勝手が良い

322, 2020-05-13

抽象オブジェクトと黄昏る

Capというスニペットマネージャーをここ数年開発している。
このマネージャーにはテンプレートエンジンが備わっており、インタプリタが組み込まれている。
インタプリタは cap make コマンドで使うことが出来る。

何回か試行錯誤して、とりあえず見通しが立って、それからまた試行錯誤して開発を進めている。
この言語は動的型付けによる実装になっていて、型が抽象化されている。実装に使っている言語は C だ。
それで型を表現するオブジェクトは抽象化されているわけだが、これは抽象オブジェクトと表現することが出来る。抽象じゃないオブジェクトがこの世にあるのか? という疑問はあるが、まぁ抽象化されているということ。

この抽象オブジェクトは Cap の基本的なデータ型を表現する。例えば nil, 整数、真偽値、配列、辞書など。
ユーザーが明示的に使えるデータ型の他にも、Cap が内部で便宜的に使うデータ型もある。
最近実装したのが「チェイン・オブジェクト」だ。
このチェイン・オブジェクトはどんな時に内部で使われるのか。

たとえば以下のようなコードがあったとする。

{@
    arr[0](1)[2].three[4]
@}

上の例では配列の添字アクセスと関数呼び出し、それからドット演算子による識別子参照が複合的に実行されている。
この複雑な文を実行するにはどうしたらいいのか考えたわけだが、結果的にチェイン・オブジェクトというもので表現することにした。
チェイン・オブジェクトは BNF では↓のようになっている。

chain: factor [ ('.' factor) | ('[' simple_assign ']') | ('(' call_args ')') ]*

一見すると複雑に見えるが、それは錯覚で、実はシンプルな構造になっている。
まず最初に factor がある。これがチェイン・オブジェクトのすべてのはじまりだ。この factor は単独で機能するので、これのあとに続くセンテンスは別に必要ない。
factor のあとのセンテンスはドット演算子、添字アクセス、関数呼び出しの順になっている。

このチェイン・オブジェクトを表現するために抽象オブジェクトにチェイン・オブジェクトの型を追加したわけだが、これが使い勝手が良い。
抽象化されているので、いろんな文脈で応用が効く。そのため、実装が容易になる。

何と言ったら良いのか、いわゆる中間表現である。最終的なデータを出力する前の抽象化された表現なので、使い勝手が良いのはある意味当然なわけである。
しかし、これは使い勝手が良い。この表現が使えると何でも実装できるような気になれる。

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク