用ASDF來組織Lisp程序編譯和加載

一.創建示例程序hello world編程


1.編寫asdf 文件hello.asd函數

[plain] view plaincopy性能

  1. <span style="font-size:18px;">(defpackage :hello-system (:use #:asdf #:cl))  測試

  2.   

  3. (in-package :hello-system)  spa

  4.   

  5. (defsystem hello  .net

  6.   :name "hello world"  component

  7.   :version "0.1"  orm

  8.   :author "cq"  blog

  9.   :depends-on ()  遞歸

  10.   :components ((:file "package")  

  11.                (: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.   

  3. (defpackage hello  

  4.   (:nicknames hello)  

  5.   (:use #:cl)  

  6.   (:export main *default-name*))  

定義了一個包,名爲:hello,而後用 use 段設置這個包能夠訪問全部標準 Common Lisp 符號,根據 Lisp 標準他們位於 common-lisp 包裏,這個包的暱稱是 cl。最後我導出了兩個 hello 包裏的符號做爲外部接口。


3.實現文件hello.lisp

[plain] view plaincopy

  1. (in-package :hello)  

  2.   

  3. (defvar *default-name* "world")  

  4.   

  5. (defun main (args)  

  6.   (if (null args)  

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

  8.       (hello args)))  

  9.   

  10. (defun hello(names)  

  11.   (when names  

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

  13.     (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

相關文章
相關標籤/搜索