Tom*_*mer 6 haskell literate-programming
有没有一种简单的方法可以将一个普通的 Haskell 文件 ( .lhs)转换为一个普通的 Haskell ( .hs) 源文件?
我认为可能有 GHC 选项,但 GHC 手册似乎没有太多关于文学程序或.lhs格式的信息。“识字”这个词甚至没有出现在索引中!
在文学编程的维基链接包含指向脚本“鸟”和“之间的转换\begin{code}.. \end{code}”的风格或转换.lhs到TeX的格式,但仅此而已。
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用两个空格缩进,这可能是一个缺点。
| 归档时间: |
|
| 查看次数: |
1024 次 |
| 最近记录: |