用ASDF来组织Lisp程序编译和加载

一.建立示例程序hello world

1.编写asdf 文件hello.asd

[plain] view plaincopy

  1. <span style="font-size:18px;">(defpackage :hello-system (:use #:asdf #:cl))
  2. (in-package :hello-system)
  3. (defsystem hello
  4. :name "hello world"
  5. :version "0.1"
  6. :author "cq"
  7. :depends-on ()
  8. :components ((:file "package")
  9. (:file "hello" :depends-on ("package"))))</span>

这个是asd即编译和加载lisp的依赖关系

defpackage定义一个系统的包名 hello-sytem, 是从后面三个包集成来的。

in-package 导入包,如果要用一个包,必须用in-package导入这个包。

接下来的 defsystem 宏就定义了整个项目的代码结构,以及一些无用的附加信息。重要的部分是 components,它定义了两个有明确依赖关系的源代码文件 package.lisp, 和 hello.lisp,一般而言,对于稍具规模的正规 lisp 程序,至少需要三个代码文件:一个用来定义 package,一个存放配置信息(这里省掉),一个放实际的业务逻辑代码。如果此项目依赖于其他 asdf 格式的 lisp 软件包,那么写在 depends-on 段里即可。

2.包定义文件package.lisp

[plain] view plaincopy

  1. (in-package :hello-system)
  2. (defpackage hello
  3. (:nicknames hello)
  4. (:use #:cl)
  5. (:export main *default-name*))

定义了一个包,名为:hello,然后用 use 段设置这个包可以访问所有标准 Common Lisp 符号,根据 Lisp 标准他们位于 common-lisp 包里,这个包的昵称是 cl。最后我导出了两个 hello 包里的符号作为外部接口。

3.实现文件hello.lisp

[plain] view plaincopy

  1. (in-package :hello)
  2. (defvar *default-name* "world")
  3. (defun main (args)
  4. (if (null args)
  5. (format t "hello ~a~%" *default-name*)
  6. (hello args)))
  7. (defun hello(names)
  8. (when names
  9. (format t "hello ~a~%" (car names))
  10. (hello (cdr names))))

定义了两个函数main和hello

上述代码里有两个函数定义,main 函数是整个程序的入口,入口参数是一个列表,如果列表为空的话就产生默认输出然后程序结束,否则就调用另一个函数 hello 来实际产生针对每个列表元素的输出,注意到这个函数我采用了尾递归的写法,这在 lisp 程序里是非常自然的编程风格,完全没有任何性能折损而且相比循环结构节省了显式的循环变量。

二.编译和加载lisp文件

1,每个模块都要有一个描述文件,module-name.asd(本例中就是hello.asd)。该文件声明了模块名,和构成该模块的文件列表。可以描述lisp文件之间的依赖关系,也可以描述模块之间的依赖关系。asd文件,类似于VC的工程文件,类似于make文件。

加载模块的方法1:

(push #p”example/” asdf:*central-registry*) :添加asd文件所在的目录

(asdf:load-system “module-name”) :加载一个模块(本例hello)

加载模块的方法2:

(load “example/module-name.asd”) :读取asd文件的内容,不加载模块()

(asdf:load-system “module-name”) :加载一个模块

三.测试代码

[plain] view plaincopy

  1. CL-USER: (hello:main nil)
  2. hello world
  3. NIL
  4. CL-USER: (hello:main ‘("a" "netease" "sa"))
  5. hello a
  6. hello netease
  7. hello sa
  8. NIL

hello是包名,main是函数名

也可以用in-package先导入包,在直接输入函数名。

源代码下载地址:

http://download.csdn.net/detail/cq20110310/4988409

引用文章地址

1.http://tianchunbinghe.blog.163.com/blog/static/7001200692314249376/

2.http://blog.csdn.net/dragonzht/article/details/8299539

时间: 2024-10-29 19:11:55

用ASDF来组织Lisp程序编译和加载的相关文章

给Lisp程序员的Python简介

给Lisp程序员的Python简介 作者:Peter Norvig,译者:jineslong<[email protected]> 这是一篇为Lisp程序员写的Python简介(一些Python程序员告诉我,这篇文章对他们学习Lisp也有帮助,尽管这不是我的本意).基本上,Python可以看作一个拥有“传统”语法(Lisp社区称之为“中缀”或者“m-lisp”语法)的Lisp方言.一个来自comp.lang.python的帖子说到“我一直不明白为什么LISP是一个不错的想法,直到我开始玩上了P

C语言程序编译的内存分配

C语言程序编译的内存分配: 1.栈区(stack) --编译器自动分配释放,主要存放函数的参数值,局部变量值等: 2.堆区(heap) --由程序员分配释放: 3.全局区或静态区 --存放全局变量和静态变量:程序结束时由系统释放,分为全局初始化区和全局未初始化区: 4.字符常量区 --常量字符串放与此,程序结束时由系统释放: 5.程序代码区--存放函数体的二进制代码 例: //main.c int a=0; //全局初始化区 char *p1; //全局未初始化区 void main() { i

你是如何成为 Lisp 程序员的(转)

我成为 Lisp 程序员的道路曲折而漫长.我曾于 2007 年 10 月 3 日在自己的日记中总结了自己的学习经历,现抄录于此. 最早在 2000 年 5 月,斯托曼院士访华时告诉我,Lisp (或者它的现代变种 Scheme)是功能最强大的编程语言,他本人就是一位高级的 Lisp 程序员,他还精通 C,GNU Emacs 就是采用 C 和 Lisp 两者开发的.我当时已经掌握了 C,但不会用 Lisp,但是我完全相信他说的都是真的.于是,一心想成为编程高手的我,决定学习和掌握这门编程语言.我从

C程序编译过程浅析【转】

转自:http://blog.csdn.net/koudaidai/article/details/8092647 前几天看了<程序员的自我修养——链接.装载与库>中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧. 我现在一般都是用gcc,所以自然以GCC编译hellworld为例,简单总结如下. hello.c源代码如下: ?[Copy to clipboard] C 1 2 3 4 5 6 [c] view plaincopy <span style=&qu

程序编译运行和exe运行之文件位置的区别

如图: 文件输入输出 1.程序编译运行 输入文件和输出文件与.c同位置 2.exe运行 输入文件和输出文件与.exe同位置

C语言程序编译过程

最近在编译DM8168的ARM端程序时经常出现未定义.重定义等报错,由于源码文件多,包含关系比较多,所以自己添加时容易乱.深深的体会到,好的代码风格是如此重要,之前也在看代码重构,以后应该更加注意代码的质量.经思考总结规律如下: 1.公用的数据结构等写为一个头文件,其他源文件包含此头文件.同时为了让不同源文件里的函数都可以使用,公用的函数可以放在此头文件中声明. 2.其他源文件里声明的变量,如果想在另一个文件里用,需要extern声明,这样可以避免各种全局变量的交互混杂. 理解的比较浅,希望高人

.NET概念:.NET程序编译和运行

.NET概念:.NET程序编译和运行 分类: c#程序设计 2012-02-29 15:46 3001人阅读 评论(2) 收藏 举报 .net编译器语言microsoftassemblyvb.net 程序的编译和运行,总得来说大体是:首先写好的程序是源代码,然后编译器编译为本地机器语言,最后在本地操作系统运行. 下图为传统代码编译运行过程: .NET的编译和运行过程与之类似,首先编写好的源代码,然后编译为微软中间语言代码,运行的时候即时编译为本地机器语言,同时.NET代码运行时有一个CLR环境来

CUDA程序编译过程中产生警告的解决方法

有时候经常使用别人用Tabhost+其它的实现demo.单纯利用Tabhost该如何使用呢? 下面看例子: public class MainActivity extends TabActivity { public TabHost tabHost; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 获取对象 tabHost = getTabH

如何组织一个程序?

# -*- coding: utf-8 -*- #python 27 #xiaodeng #如何组织一个程序? #一般来讲,一个python程序包含了多个含有python语句的文本文件. #程序是作为一个主体的,顶层的文件来构造的,配合有0个或多个支持的文件,这些文件在python中叫模块 #在python中,一个文件导入了一个模块来获得这个模块定义的工具的访问权 #这些工具被认为是这个模块的属性,通俗来讲是变量名