下面是參考了Standford大學的CS157課的一個PPT。作爲一個非常基本的LISP入門,給大家一個感性的認識。一般情況下我們可以安裝CLISP,Common Lisp,這個是標準。在Windows下和Linux下都有相應的版本。
解釋器
在Windows下可以直接雙擊相應的軟件,然後打開;在Linux下可以安裝完clisp後,輸入clisp開啓clisp的命令行。退出輸入(quit),必須要加括號,因爲Lisp的所有的函數調用都是以括號開始,括號結束。新人在看到一堆括號後,會覺得有點恐慌,不過一般的編輯器,只要支持Lisp,都會提供縮進和括號匹配的。
解釋器的模式是REPL:read-eval-print-loop。輸入一個命令,解釋, 打印,然後執行。Lisp將最後一個值作爲返回值。嘗試如下命令:
(+ 1 2 3)
會打印6。恭喜,我們已經開始使用了第一個函數+。Lisp的函數都是放在後面函數後面,以空格區分,注意不是逗號。
數據類型
原子數據和列表。原子數據包括變量名,數值,nil(保留),T(保留)。nil表示空值,T表示含義很多。可表示真,可以表示在對象系統中的基類等。在Lisp中唯一的假值是nil。而且Lisp是大小寫不敏感的。
(setq my-age 24)
上述語句setq表示賦值函數。q表示quote,即不對第二個參數求eval,直接賦值爲第三個參數。
列表是用括號擴起來的一系列數據。例如(a), (+ 6 7), (a (e f g) h), (), nil。ni既是一個原子值,有是一個空的列表。對列表進行計算
(+ 6 7) ; => 13
(foo 17 18 19) ; => Error (function not defined)
(+ my-age 4) ; => 28
對列表進行計算時,首先對每個元素計算,然後在相應的函數上調用這些參數。
Lisp提供很多內置函數:+, *, - , /, max, min, sqrt。針對列表還有一些列的內置函數。
(cons 'a nil) ; => (a)
(list 'a 'b 'c) ; => (a b c)
(append '(a b c) (d e f) => (a b c d e f)
這裏的單引號表示告訴Lisp,不要對這些值求eval,而是用這些值的本身。訪問List的元素,有以下函數
(first (list 1 2 3)) ; => 1
(rest (list 1 2 3)) ; => ( 2 3)
(car (list 1 2 3)) ; => 1
(cdr (list 1 2 3)) ; => (2 3)
其中car和cdr是可以重複使用的。例如caar,cdar等。
分支和循環
分支使用if,cond,when, unless,循環使用dotimes,dolist,還有強大的loop。
(if (zerop a)
(true-branch)
(false-branch))
(dotimes (i count) (body-form))
定義函數
定義函數defun關鍵字。
(defun hello-world (name)
(format t "~a~a" "hello world" name))
打印
打印有兩個函數,print和format。一般的print就可以滿足需求。format類似與C語言的printf,可以設置標籤,不過它是以~開始,不是%。
(format ouput-stream control-string variable*)
output-stream表示輸出stream,t表示標準輸出,nil表示可以以字符串輸出。其它的表示寫到其它流當中。控制字符串有以下常用的:
- ~d,輸出整數
- ~[,cnt]f, 輸出浮點數
- ~[cnt]%, 輸出浮點數
- ~%換行