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

ユーザー型の宣言機能 #34

Open
marihachi opened this issue Jan 27, 2023 · 5 comments
Open

ユーザー型の宣言機能 #34

marihachi opened this issue Jan 27, 2023 · 5 comments
Labels

Comments

@marihachi
Copy link
Member

marihachi commented Jan 27, 2023

構想

interface Item {
  search(name: string): bool;
}

class File {
  name: string;
}

impl File : Item {
  search(name: string): bool {
    return this.name == name;
  }
}

class Directory {
  name: string;
}

impl Directory : Item {
  search(name: string): bool {
    return this.name == name;
  }
}

interface構文

  • メソッドを宣言できる。

class構文

  • フィールドを宣言できる。

impl構文

  • classへのメソッド実装を記述できる。
  • classへのinterfaceのメソッド実装を記述できる。

細かい部分

  • インターフェースへの実装が見つかれば(=インポートされている)、クラスはインターフェースを実装してる扱いにする。
  • インターフェースの実装の他に、クラスに同じシグネチャのメソッドが実装されてる場合がある。
    • クラスへの実装とインターフェースへの実装でメソッド実装が競合した場合の扱い
      • 同居できないで良いかも。同居できるとしたら、クラスへの実装よりもインターフェースの実装が優先される?
    • 実装が競合した時のために、インポート構文では個別にインポートできる必要がある。
@marihachi marihachi changed the title 抽象化機能 ユーザー型の宣言機能 Jan 27, 2023
@marihachi
Copy link
Member Author

複数のインターフェースにまたがる実装についても考えたほうが良さそう

@marihachi
Copy link
Member Author

多分この案は採用しない

@marihachi marihachi mentioned this issue Feb 13, 2023
@marihachi
Copy link
Member Author

marihachi commented Apr 17, 2023

メソッドを実装する構文

implement構文で、その型へのメソッドを実装できる。

インスタンスメソッド

最初の引数がthisであればインスタンスメソッドになる。

struct Point {
    x: number,
    y: number,
}
implement Point {
    fn add(this, p: Point) {
        this.x += p.x;
        this.y += p.y;
    }
}
fn main() {
    var p1 = new Point { x: 1, y: 1 };
    var p2 = new Point { x: 2, y: 3 };
    p1.add(p2);
    // { x: 3, y: 4 }
}

静的メソッド

最初の引数がthisでなければ静的メソッドになる。

struct Point {
    x: number,
    y: number,
}
implement Point {
    fn add(a: Point, b: Point) {
        new Point {
            x: a.x + b.x,
            y: a.y + b.y,
        }
    }
}
fn main() {
    var p1 = new Point { x: 1, y: 1 };
    var p2 = new Point { x: 2, y: 3 };
    Point.add(p1, p2);
    // { x: 3, y: 4 }
}

@marihachi
Copy link
Member Author

marihachi commented Apr 17, 2023

feature

featureはインターフェースのような機能。
複数の型をまとめて扱うために、それぞれの型が実装しなければならないメソッドを規定する。

構文案

feature Iterator<T> {
    fn next(this): Option<T>;
}

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

No branches or pull requests

1 participant