c - 多种语言的文学编程

标签 c perl haskell literate-programming idris

我有一个库项目,需要 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/

相关文章:

c# - 将 C 结构编码为 C# 委托(delegate)的返回值

c++ - gcc 警告和 gcc 错误消息之间的区别

C++ 调用 perl 代码 - eval_sv 不将参数传递给脚本

haskell - 用镜头构造谓词

list - 此类型定义是否处理空列表?

c - 如何在c中创建文件的精确副本

c - 释放字符时出错 ***

arrays - 标量上下文中新 'each @array'的行为

perl - 如何有条件地使用 Test::Simple?

c++ - 长期绘制密集粒子系统的良好且安全的语言是什么?