Lisp中的Ant(或NAnt)

6
在他的文章Lisp的本质中,Slava Akhmechet通过使用Ant/NAnt作为例子向人们介绍了lisp。是否有一个用lisp实现的Ant/NAnt版本?在其中可以使用实际的lisp代码来定义事物,而不是xml?我曾经需要创建对NAnt的添加,并希望能够绕过xml系统,就像Slava所展示的那样。
4个回答

12

Ant是一种解释某种XML语言编写的命令的程序。正如justinhj在他的回答中提到的,您可以使用某些XML解析器(例如上面提到的XMLisp),将XML描述转换为某种Lisp数据,然后在Lisp中编写其他代码。您还需要重新实现一些Ant解释。

Lisp中许多原始操作都不需要。Lisp内置了一些文件操作(例如delete-file、rename-file、probe-file等)。有些操作缺失并需要实现-或者您可以使用现有库之一。还要注意,您可以将Lisp文件LOAD到Lisp中并执行代码-它已经带有交互式前端(与Java不同)。

通常情况下,Common Lisp中的高级构建系统实现了一个称为“SYSTEM”的抽象概念。有几个这样的系统。ASDF是一种常见选择,但也有其他选择。系统具有子系统和文件。系统也有一些选项。其组件也具有选项。系统具有组件的结构描述、依赖关系描述或“操作”及其依赖关系的描述。通常以面向对象方式实现这些内容,并且可以将“操作”实现为Lisp(通用)函数。Lisp还提供类似于COMPILE-FILE的函数,该函数将使用Lisp编译器编译文件。如果您的代码有C文件-则需要调用C编译器-usually通过一些允许调用外部程序的实现特定函数(此处为C编译器)。

正如dmitry-vk所提到的,ASDF是一种常见选择。LispWorks提供Common Defsystem。Allegro CL拥有自己的DEFSYSTEM。它的DEFSYSTEM manual还描述了如何扩展它。

所有Lisp解决方案都使用某种Lisp语法(而不是XML语法),通常由宏实现来描述系统。一旦读入Lisp中,它将转换为数据表示形式-通常使用CLOS实例表示系统、模块等。然后,操作也是Lisp函数。某些高阶函数沿着组件图/树行走并在必要时执行操作。其他一些工具沿着组件图/树行走并返回操作表示-然后是建议的计划-然后用户可以让Lisp执行整个计划或计划的一部分。

在Lisp机器上,简单的系统描述如下:

(sct:defsystem scigraph
    (:default-pathname "sys:scigraph;"
     :required-systems "DWIM")
   (:serial "package" "copy" "dump" "duplicate" "random"
            "menu-tools" "basic-classes" "draw" "mouse"
            "color" "basic-graph" "graph-mixins" "axis"
            "moving-object" "symbol" "graph-data" "legend"
            "graph-classes" "present" "annotations" "annotated-graph"
            "contour" "equation" "popup-accept" "popup-accept-methods"
            "duplicate-methods" "frame" "export" "demo-frame"))

以上定义了一个名为SCIGRAPH的系统,所有文件都应按照串行顺序进行编译和加载。

现在我可以看到Lisp机如何更新编译代码:

命令:Compile System (a system [default Scigraph]) Scigraph (keywords)
                        :Simulate (compiling [default Yes]) Yes
构建Scigraph版本Newest的编译操作计划如下: 编译RJNXP:>software>scigraph>scigraph>popup-accept-methods.lisp.newest 加载RJNXP:>software>scigraph>scigraph>popup-accept-methods.ibin.newest

它会编译一个文件并加载它 - 我已经加载了软件并仅更改了这个文件。

有关ASDF,请参见CLIKI页面上提到的文档 - 它的工作方式略有不同。


感谢您花时间回答!我想我对Ant最大的不满在于,由于它使用XML,我无法直接利用底层语言的强大功能来执行某些操作。只有已经“移植”到xml侧的操作(函数)可用。我认为Lisp实现的系统之美在于,所有的lisp都是可用的,不需要为本地函数创建XML包装器。 - Daniel

4
Stuart Halloway的即将出版的书《Programming Clojure》通过整本书构建Lancet作为示例应用程序。Lancet是一种Clojure构建系统,可以(可选地)直接与Ant集成。源代码和示例可用
如果你只想使用Lisp代码生成Ant XML文件,你可以使用类似于clj-html的Clojure或CL-WHO的Common Lisp。从Lisp s-exps生成XML很有趣也很容易。

1
也许您可以在Lisp中定义事物,并在将它们传递给NAnt的时候将它们转换为XML。
XMLisp这样的工具可以更轻松地在两种表示之间进行切换。
编辑:实际上,xml-emitter 更为合理。

文章提到的是xml是元语言,这真的防止你能够使用实现语言。如果Ant/NAnt使用lisp实现,你可以在每个节点中使用所有的lisp功能... 这听起来非常吸引人! - Daniel
没错,我想Scons就是一个例子,因为你可以在那个构建系统中运行任意的Python代码。另一方面,我认为像make和jam这样成熟的构建系统已经演化出了简洁而富有表现力的语言来构建代码,这使得使用Lisp Ant的想法变得不太实用。 - justinhj

1

Common Lisp 的 ASDF (Another System Definition Facility) 与 Make/Ant 类似 (但不完全相同 — 它的目标是构建 Lisp 程序,而不是像 make 或 ant 那样的通用系统)。它可以使用 Lisp 代码进行扩展 (包括系统和组件的子类化,向系统添加操作等)。例如,有一个 asdf-ecs 扩展程序允许将 C 源文件包含在系统中 (并编译)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接