yhara.jp

Recent Posts

処理系ミートアップ #2

2021-06-12
Tech

発表資料です。

雑談

  • vimの:terminal + |& less -Rが快適

前回のあらすじ

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

ミートアップを終えて

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

More posts

Posts

(more...)

Articles

(more...)

Category

Ads

About

About the author