処理系ミートアップ #3
2021-06-27
Event定期ミートアップ 第3回 - prog-lang-sys-ja
最近やったこと
- BiwaScheme (Scheme in JS)リリース準備
- 準備を始めるとついでにこれも入れようかな…となりがち
- 需要があればまたそのうち
Shiika
- 書きやすさ重視の静的言語
- enumの実装を進めた
enum Maybe<V>
case Some<V>(value: V)
case None
end
Some = Maybe::Some
None = Maybe::None
a = Some<Int>.new(1)
b = None
f = fn(x: Maybe<Int>) { x }
f(a)
f(b)
# TODO: unless a.value == 1; puts "ng Some#value"; end
残作業
- 継承を禁止
- アクセサを生やす
- 書き換えを許すか?(Haskell: 許さない, Rust: 許す)
- 案 明示したものだけ更新を許す
enum Foo
case Bar(x: Int, var y: Int)
end
b = Foo::Bar.new(0, 0)
b.x += 1 # NG
b.y += 1 # OK
次の作業
パターンマッチ
- これがないとenum型をまともに使えない
- 実装方法は?
案a
- クラスにid(1,2,3,...)を振り、それをインスタンスに入れる
- パッケージシステムとの兼ね合い
- パッケージ側も1から採番したら被るよね
案b
- 文字列で比較する
- 遅そう…、
案c
- Shiikaでは各クラスにつき1つの「クラスオブジェクト」が生成される
- ということはクラスオブジェクトのアドレスをidがわりに使えるのでは
@"::String" = external global %"Meta:String"*
フィードバック
- 全体でユニークである必要はなく、あるenum内でcase達に1,2,3...を振れば充分なのでは
- なるほど
- ただ将来的に
1.class
とかを実装したいんですよね - caseに数値が振ってあったほうが網羅性チェックの実装時に便利かも?