2020-08-12: stackparseつくってた
やったこと
Scala
miniparseの公開が面倒になってきたので、今度はstackparseというのを作ってる。
パーサーをデータ構造にして、Freeモナドみたいな感じでスタックを使わずにパースできる、みたいな。
何はともあれimmutableなのが特徴かもしれない。
miniparseほどでなくともparser-combinatorsよりは速いといいなぁ、と思っている。
一応動くものはできたのだけど、型が妙に複雑になっていて本当にこれでいいのか、と悩む。
cutとかの概念に関しては理解が深まった気もする。
あと、作りながら、これSelective関手にして上手く解析して最適化したらいい感じにやれるのでは、と思って少し調べてみたら、こんなのを見つけた。
https://icfp20.sigplan.org/details/icfp-2020-papers/20/Staged-Selective-Parser-Combinators
Selective関手を使ったパーサーコンビネータライブラリで、内部ではVMでパースを行うのだけど、VMへのinstructionへのコンパイルをSelectiveの範囲なら静的に行えるから高速、みたいな感じだと思う。
実装はこのParsleyというやつっぽい。
https://github.com/J-mie6/ParsleyHaskell
Scala版もあるけど、こっちは作りかけな気がする。
https://github.com/J-mie6/Parsley
Haskellだとがんばると型安全なままやれるっぽい。
Scalaでも不可能じゃないけど効率がどうかなぁ‥‥。
Selectiveをパーサーに使うというアイディアはすごく興味深いので、もう少し調べてみたい。
というか今年のICFPオンラインだし、発表聞けたりしないかな。