我有一个库项目,需要 C 与其他语言的互操作性和合理的性能,但必须非常清楚地记录,就像文学编程一样,并且其文档可能会受益于函数式方法,如 Haskell,甚至 Idris '证明功能。
因此,我有兴趣将此库构建为一个文字程序,首先编写文档和工作 Idris 原型(prototype)代码,然后编写与 Idris 代码紧密并行的 C 代码,以解决任何性能问题并可以轻松地从其他语言链接.
我需要什么文学编程工具?
NuWeb 是为多语言读写编程而设计的,但它们对 @ 符号或任何转义字符的使用对于 Idris、Haskell 等函数式语言来说是有问题的。
Idris wants a literate programming tool 我可以贡献。我喜欢他们的首选方法,即仅使用由 .tex
block 分隔的 \begin{code} .. \end{code}
文件。
Idris、Haskell 等不需要像 C 那样的缠结,因此这样做会增加复杂性,我希望我在这里使用的任何工具都保留下来。
最大限度地减少库使用者工具的方法可能是使用简单的 Perl 脚本(如 cat_latex_env
)提取 C 和 Idris 代码:
#!/usr/bin/perl
use strict;
use warnings;
sub usage { die "Usage: cat_latex_env enviroment_name [filename]\n"; }
usage if ($#ARGV < 0);
my $env = shift;
my $begin = quotemeta "\\begin{$env}";
my $end = quotemeta "\\end{$env}";
while (<>) {
if (/$begin/../$end/) {
next if /$begin/ || /$end/;
print;
}
}
此时 Idris 应该可以正常编译。我可以嵌入 CWEB 或 NuWeb 等 C 语言编程工具所需的缠结指令。
想法?
最佳答案
如果文档是最重要的,并且您有一定的 emacs 亲和性,那么您可能会比查看 org-mode 中的文学编程支持更糟糕。 Babel是一个组织模式扩展,允许与许多编程环境集成,包括缠结编译语言、执行代码块……
它完全与语言无关,并且由于它具有大纲的 DNA,因此它允许以结构化的方式管理文档。当然,它会从您的源生成语法突出显示的 HTML/LateX/PDF/...。
查看http://orgmode.org/worg/org-contrib/babel/intro.html了解更多信息。
示例:
** Compiles libpq library for iOS
copy this script as *build-ios.sh* in the root of the postgresql
source tree.
#+BEGIN_SRC sh tangle:build-ios.sh
mkdir -p build
rm -rf build/* #*/
function build_libpq()
{
make distclean
./configure \
...snip...
lipo -create -output libpq.a build/*
#+END_SRC
Run it and it will create a universal library and separate arm
library in the root folder.
我希望这能让您了解如何使用 org-mode/Bable 组合创建文档/代码。当然,stackexchange 的答案不能触及这个系统的表面。
关于c - 多种语言的文学编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29399948/