一.創建示例程序hello world編程
1.編寫asdf 文件hello.asd函數
[plain] view plaincopy性能
<span style="font-size:18px;">(defpackage :hello-system (:use #:asdf #:cl)) 測試
(in-package :hello-system) spa
(defsystem hello .net
:name "hello world" component
:version "0.1" orm
:author "cq" blog
:depends-on () 遞歸
:components ((:file "package")
(: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
(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
[plain] view plaincopy
(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」) :加載一個模塊
三.測試代碼
[plain] view plaincopy
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