Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: ユーザー定義型 #641

Open
salano-ym opened this issue Apr 29, 2024 · 17 comments
Open

feat: ユーザー定義型 #641

salano-ym opened this issue Apr 29, 2024 · 17 comments

Comments

@salano-ym
Copy link
Member

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

利点

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

問題点

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

関連

@syuilo
Copy link
Collaborator

syuilo commented May 6, 2024

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

@FineArchs
Copy link
Member

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

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

@syuilo
Copy link
Collaborator

syuilo commented May 6, 2024

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

みたいなのを考えてた

@FineArchs
Copy link
Member

その方法では

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

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

@syuilo
Copy link
Collaborator

syuilo commented May 6, 2024

Symbolだと衝突しないわね

@syuilo
Copy link
Collaborator

syuilo commented May 6, 2024

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

a1 == a2 // false

@FineArchs
Copy link
Member

Symbolだと衝突しないわね

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

@syuilo
Copy link
Collaborator

syuilo commented May 6, 2024

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

@salano-ym
Copy link
Member Author

ちなみに動機としては、

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

といったところです。

@FineArchs
Copy link
Member

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

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

@salano-ym
Copy link
Member Author

salano-ym commented May 6, 2024

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

@uzmoi
Copy link
Member

uzmoi commented May 27, 2024

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

@FineArchs
Copy link
Member

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

@marihachi
Copy link
Contributor

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

@marihachi
Copy link
Contributor

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

@FineArchs
Copy link
Member

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

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

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

@FineArchs
Copy link
Member

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants