aiscript icon indicating copy to clipboard operation
aiscript copied to clipboard

feat: ユーザー定義型

Open salano-ym opened this issue 1 year ago • 17 comments

データ構造(≒obj)に型名などを付けられるようにして、統一的にデータの種類を区別する方法があると嬉しい。現状でも識別用のプロパティを用意すれば可能だが、別用途のものと衝突する可能性がある。

利点

  • 異なるデータ構造を統一的な方法で識別できる
  • プリミティブ型を増やす必要性が減る

問題点

  • 既存仕様との兼ね合いが難しい。

関連

  • #66
  • #75

salano-ym avatar Apr 29 '24 18:04 salano-ym

衝突の心配なしにデータを区別したいという目的であればJavaScriptにおけるSymbol的なものを実装するという手もある

syuilo avatar May 06 '24 09:05 syuilo

衝突の心配なしにデータを区別したいという目的であればJavaScriptにおけるSymbol的なものを実装するという手もある

個々のデータではなくデータの構造の種類を区別したいという話だと思うので、ちょっとズレるような?

FineArchs avatar May 06 '24 09:05 FineArchs

{
  type: Symbol("aaa")
  foo: "bar"
}

みたいなのを考えてた

syuilo avatar May 06 '24 09:05 syuilo

その方法では

現状でも識別用のプロパティを用意すれば可能だが、別用途のものと衝突する可能性がある。

これが解決できないと思います

FineArchs avatar May 06 '24 09:05 FineArchs

Symbolだと衝突しないわね

syuilo avatar May 06 '24 09:05 syuilo

let a1 = Symbol("aaa")
let a2 = Symbol("aaa")

a1 == a2 // false

syuilo avatar May 06 '24 09:05 syuilo

Symbolだと衝突しないわね

プロパティ名が文字列のままなので、typeというプロパティ名を他で使いたい事情があった時に困ります

FineArchs avatar May 06 '24 09:05 FineArchs

プロパティ名自体をsymbolにするとか

syuilo avatar May 06 '24 09:05 syuilo

ちなみに動機としては、

  • 今のDate系はただのnumを扱っていて分かりにくいからこういったものをラッピングできると嬉しい。
  • でもプリミティブ型を次々増やすのよくない気がする。

といったところです。

salano-ym avatar May 06 '24 09:05 salano-ym

プロパティ名自体をsymbolにするとか

これは一つの手ですね Symbol:typeみたいな定数を用意してCore:typeobj[Symbol:type]を参照する、というような実装も考えられます 実装が比較的楽な代わりにユーザー側に分かりづらい気もしますが…

FineArchs avatar May 06 '24 09:05 FineArchs

objかどうかを区別するためにCore:typeは変えない方がいいと思います。 objだけを対象にするならjs側でプロパティを増やしてObj:type(obj), Obj:set_type(obj, name)とする方法も可能?

salano-ym avatar May 06 '24 10:05 salano-ym

型アノテーションに書けなかったりメソッドを定義できなかったりするので、素直にclassみたいなものを書けるようにした方が最終的にシンプルになるように思います。

uzmoi avatar May 27 '24 14:05 uzmoi

オブジェクト志向ができれば全て解決するのはそれはそう

FineArchs avatar May 27 '24 22:05 FineArchs

インスタンス化可能な構造の宣言機能ですかね

marihachi avatar Jun 21 '24 10:06 marihachi

型名付きオブジェクトとか objの内部表現に型の一意なIDを持たせて、型名からIDに解決できるようにすれば、型が一致するかのチェックに利用できそうです。 クラスのようなフィールドを宣言するようなものよりは緩く、手軽に利用できると思います。

marihachi avatar Jun 21 '24 10:06 marihachi

インスタンス化可能な構造の宣言機能

型が一致するかのチェック

この2つはクラスで同時に実現できますが、本来別々の需要なので別々の機能として追加したさはありますね (まあ前者に関してはファクトリー関数で用が足りるといえばそうではあるのですが)

FineArchs avatar Jun 21 '24 11:06 FineArchs

それはそれとして従属関係を示すためにOOPを使いたい時もあります

FineArchs avatar Jun 21 '24 11:06 FineArchs