当前位置: 首页 > news >正文

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

来自:CSDN博客推荐文章   |  时间:2013-01-12 17:33:23

原文链接: http://blog.csdn.net/cq20110310/article/details/8496499

源代码下载地址:

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


一.建立示例程序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文件

,每个模块都要有一个描述文件,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先导入包,在直接输入函数名。


源代码下载地址:

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


转载于:https://my.oschina.net/freeblues/blog/102849

相关文章:

  • TensorFlow与OpenCV,读取图片,进行简单操作并显示
  • 移动终端开发必备知识
  • MAC配置环境变量
  • oracle的nvl和sql server的isnull
  • UTC时间与当地时间的转换关系?
  • oracle分页查询
  • 做项目学习Django2.0开发
  • [转]虚拟机下Ubuntu共享主机文件(Ubuntu、VMware、共享)
  • js中clientHeight,offsetHeight,scrollHeight的区别
  • Range Slider With Progress
  • nohup命令
  • 优先级队列PriorityBlockingQueue
  • Webservice工作原理及实例
  • 【后台任务】后台优化(15)
  • Hello My LINQ World——自定义LINQ Provider实现LINQ to LDAP查询(其三)
  • Google 是如何开发 Web 框架的
  • JavaScript-如何实现克隆(clone)函数
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Java多态
  • js
  • Laravel5.4 Queues队列学习
  • react-native 安卓真机环境搭建
  • Redis学习笔记 - pipline(流水线、管道)
  • Sass 快速入门教程
  • spring学习第二天
  • 关于字符编码你应该知道的事情
  • 区块链将重新定义世界
  • 如何利用MongoDB打造TOP榜小程序
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用API自动生成工具优化前端工作流
  • 算法---两个栈实现一个队列
  • 微信公众号开发小记——5.python微信红包
  • 一个JAVA程序员成长之路分享
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​secrets --- 生成管理密码的安全随机数​
  • ​TypeScript都不会用,也敢说会前端?
  • #Ubuntu(修改root信息)
  • $(selector).each()和$.each()的区别
  • ${factoryList }后面有空格不影响
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (二)JAVA使用POI操作excel
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (九)c52学习之旅-定时器
  • (一)基于IDEA的JAVA基础1
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Core 成都线下面基会拉开序幕
  • .NET Framework .NET Core与 .NET 的区别
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .net和jar包windows服务部署