yhara.jp

Recent Posts

処理系ミートアップ #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に数値が振ってあったほうが網羅性チェックの実装時に便利かも?

More posts

Posts

(more...)

Articles

(more...)

Category

Ads

About

About the author