将识字的 Haskell (.lhs) 转换为 Haskell (.hs)

Tom*_*mer 6 haskell literate-programming

有没有一种简单的方法可以将一个普通的 Haskell 文件 ( .lhs)转换为一个普通的 Haskell ( .hs) 源文件?

我认为可能有 GHC 选项,但 GHC 手册似乎没有太多关于文学程序或.lhs格式的信息。“识字”这个词甚至没有出现在索引中!

文学编程的维基链接包含指向脚本“鸟”和“之间的转换\begin{code}.. \end{code}”的风格或转换.lhs到TeX的格式,但仅此而已。

K. *_*uhr 5

GHC 本身使用一个独立的 C 程序unlit来处理.lhs文件。您可能会在 GHC 安装中的某处找到它。如果你运行它,它会显示一些命令行选项而没有解释:

$ cd ~/.stack/programs/x86_64-linux/ghc-8.6.4/lib/ghc-8.6.4/bin
$ ./unlit
usage: unlit [-q] [-n] [-c] [-#] [-P] [-h label] file1 file2
Run Code Online (Sandbox Code Playgroud)

深入研究源代码,看起来选项是:

-q   "quiet": ignore certain errors, so permit missing empty lines before and after
     "bird" style and accept completely empty programs
-n   (default) "noisy": opposite of -q, so be noisy about errors
-c   "crunch": don't leave blank lines where literate comments are removed
-#   delete lines that start with "#!"
-P   suppress CPP line number pragma, but only matters if `-h` is supplied
-h   File name for an initial `#line` pragma
Run Code Online (Sandbox Code Playgroud)

所以,命令行:

$ /path/to/unlit -c myfile.lhs myfile.hs
Run Code Online (Sandbox Code Playgroud)

转换可能会做得很好myfile.lhs

This is a literate program

> main :: IO ()

using both code styles
\begin{code}
  main = putStrLn "hello"
\end{code}
Run Code Online (Sandbox Code Playgroud)

一个“文盲”程序myfile.hs

  main :: IO ()
  main = putStrLn "hello"
Run Code Online (Sandbox Code Playgroud)

对于“bird”样式,它实际上用空格替换了 '>' 字符并将其余的缩进保留在原位,因此对于我上面的示例,输入的两行都myfile.hs用两个空格缩进,这可能是一个缺点。