Lisp tutorial

  下面是參考了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表示可以以字符串輸出。其它的表示寫到其它流當中。控制字符串有以下常用的:

  1. ~d,輸出整數
  2. ~[,cnt]f, 輸出浮點數
  3. ~[cnt]%, 輸出浮點數
  4. ~%換行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章