博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用ASDF来组织Lisp程序编译和加载
阅读量:5906 次
发布时间:2019-06-19

本文共 2026 字,大约阅读时间需要 6 分钟。

hot3.png

一.建立示例程序hello world

1.编写asdf 文件hello.asd

(defpackage :hello-system (:use #:asdf #:cl))  

  

(in-package :hello-system)  

  

(defsystem hello  

  :name "hello world"  

  :version "0.1"  

  :author "cq"  

  :depends-on ()  

  :components ((:file "package")  

               (:file "hello" :depends-on ("package"))))

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

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

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

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

2.包定义文件package.lisp

(in-package :hello-system)  

  

(defpackage hello  

  (:nicknames hello)  

  (:use #:cl)  

  (:export main *default-name*))  

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

3.实现文件hello.lisp

(in-package :hello)  

  

(defvar *default-name* "world")  

  

(defun main (args)  

  (if (null args)  

      (format t "hello ~a~%" *default-name*)  

      (hello args)))  

  

(defun hello(names)  

  (when names  

    (format t "hello ~a~%" (car names))  

    (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”) :加载一个模块

三.测试代码

CL-USER: (hello:main nil)  

hello world  

NIL  

CL-USER: (hello:main '("a" "netease" "sa"))  

hello a  

hello netease  

hello sa  

NIL  

hello是包名,main是函数名

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

源代码下载地址:

引用文章地址

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

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

转载于:https://my.oschina.net/u/188924/blog/306583

你可能感兴趣的文章
Python菜鸟之路:Jquery Ajax的使用
查看>>
LeetCode算法题-Maximum Depth of Binary Tree
查看>>
Cox 教学视频5
查看>>
使用ffmpeg实现对h264视频解码 -- (实现了一个易于使用的c++封装库)
查看>>
Android Xutils 框架
查看>>
书摘—你不可不知的心理策略
查看>>
Linux安装telnet
查看>>
sap scriptfom 多语言翻译
查看>>
黄聪:3分钟学会sessionStorage用法
查看>>
Entity Framework 全面教程详解(转)
查看>>
挖掘数据金矿 领军协同创新 曙光荣膺“2016大数据创新应用领袖企业”称号
查看>>
Fast通道获得Win10 Mobile Build 14977更新
查看>>
Firefox 跟踪保护技术将页面加载时间减少 44%
查看>>
java解析虾米音乐
查看>>
mysql 多行合并函数
查看>>
艾级计算机的发展与挑战
查看>>
RocketMQ事务消息实战
查看>>
手把手教你做出好看的文本输入框
查看>>
zabbix 3.2.7 (源码包)安装部署
查看>>
vsCode 快捷键、插件
查看>>