処理系ミートアップ #2
2021-06-12
Tech発表資料です。
雑談
- vimの:terminal +
|& less -R
が快適
前回のあらすじ
- 処理系Slackのミートアップに参加しました - yhara.jp
- enumを入れたい
- が、まずスーパークラスが型パラメータを持てるよう拡張する必要があることに気づいた
enum
前回のが間違ってたので訂正版
enum Either<A, B> #=> class Either<A, B>
case Left<A>(value: A) #=> class Either::Left<A, B> : Either<A, B>
case Right<B>(value: B) #=> class Either::Right<A, B> : Either<A, B>
end
- ポイント:記述としては
Left<A>
だが、定義されるクラスはLeft<A, B>
のようにBも持たないといけない
enum Maybe<T> #=> class Maybe<T>
case Some<T>(value: T) #=> class Maybe::Some<T> : Maybe<T>
case None #=> class Maybe::None_ : Maybe<Never>
end # Maybe::None = Maybe::None_.new
- ポイント:0引数のcaseの親クラスはbottom型(
Never
)を使う - Noneを使うたびに
None.new
と書くのは変なのでNone
はクラスではなくオブジェクトとする
スーパークラス
class Foo<S, T> : Pair<T, Array<S>>
~~~~ ~~~~~~~~~~~
typarams tyargs (not typarams)
実装
締め切り効果ですごく進捗が出ました。
https://github.com/shiika-lang/shiika/pull/287
- ユニットテストを書いた
- https://github.com/shiika-lang/shiika/pull/287/files#diff-926d15ff6b52eeeee2c4bb1a275afcb1e7d7fee8b792fff1a1151cbd94df4366R241
- 前回「integration testだけだよ」って言ったけど、型まわりの複雑なところはさすがにユニットテスト欲しくなりました
- 変性を実装していないので関数の戻り値については超ad hocなことをしている
- https://github.com/shiika-lang/shiika/compare/super-typaram?expand=1#diff-926d15ff6b52eeeee2c4bb1a275afcb1e7d7fee8b792fff1a1151cbd94df4366R204
- ユーザが明示的に変性を指定できるわけではなくても、TyParamには変性の情報を持たせたほうがよいことがわかった
ミートアップを終えて
enumのメソッドを書くときはどうしますか?という話があった。それ考えないとなあ。
enum Maybe<V>
case Some<V>(value: V)
def is_some -> Bool
true
end
case None
def is_some -> Bool
false
end
end
というのはどうかな?と思ったんだけど、メソッドが増えたときに最悪なことになるので駄目だな。
となると無難にこうですかねぇ。
enum Maybe<V>
case Some<V>(value: V)
case None
def is_some -> Bool
match self
when Some(_)
true
when None
false
end
end
end