haskell-jp / questions #96 at 2021-04-17 14:29:40 +0900

前ここで質問させていただいた、
https://haskell-jp.slack.com/archives/C5666B6BB/p1594261873131500
に関連するのですが、haskellのlayout付きコードをbraces and semicolonsに完全に変換するのって、自分で例のレポートのL関数を(悪名高いparse-error(t)含め)実装するしかないのでしょうか? ghcの拡張をふんだんに使ったコードを変換するので、あんまり車輪の再発明はしたくなくて…
https://github.com/goldfirere/th-desugar とか要件を満たしますかね?
ああー、と思ったけどレイアウトルールとかについては何もしてくれないか... :disappointed:
そうっぽいですね….
「あるライブラリパッケージのモジュールを全部1つのexecutable program source fileに埋め込む」みたいなことをしたくて,ライブラリ側をimport部と宣言部に分けてpreprocessしてそれぞれぶち込んじゃえ,という発想になったんですね.import部において,対象パッケージ外をimportしてるものを全部 import qualifiedにして対応する宣言部のimported nameをぜんぶfully-qualified nameに置き換えようと思ったときに,レイアウトがおもいっきり崩れて辛いんで,レイアウトから自由になれればいいなあ,という動機だったんですが…
将来的な話ですが1ファイルに複数モジュール定義できるようにするLocal modulesのproposalが議論されていますよ。

https://github.com/ghc-proposals/ghc-proposals/pull/283
:point_up: の自分の発言で思いついたんですが、Template Haskellでパースしてからpretty printしちゃうというのはいかがでしょうか?ドキュメントのとおり、そもそもTempate Haskellレベルの構文木ではレイアウトルールは一切考慮されないみたいですし
http://hackage.haskell.org/package/template-haskell-2.17.0.0/docs/Language-Haskell-TH.html#t:Exp
あっ、もちろん適当なフォーマッターを使うのもアリだと思います。
@autotaker いいですね!
@igrep 元々fully qualificationをどうやったらいいかわからなくて、template haskellに頼るつもりだったので、割とありな気はしますね。
@igrep ただ,
runST $ do VU.unsafeWrite ufpar root2 root1
           VU.unsafeModify ufrank (+1) root1


Control.Monad.ST.runST $ do Data.Vector.Unboxed.Mutable.unsafeWrite ufpar root2 root1
           Data.Vector.Unboxed.Mutable.unsafeModify ufrank (+1) root1

にしちゃった,みたいなのって,フォーマッターでなんとかなるんでしょうか…?
なるんだったらそれでなんとかしたい
なるほど... 確かにそうなってしまうとパースが失敗するでしょうからきついでしょうね... :disappointed: