lisp base

一 、quoteide

lisp 使用s-expr表示數據和代碼,一般會將第一項做爲函數,而將後續元素當作參數傳給第一項進行計算。能夠經過quote來進行其餘解析,quote可用(‘)表示:函數

1  ( + 1 12   2
3 
4  ‘(+ 1 15   (+ 1 1)

二 、反引號(·) oop

(·)按鍵(~)爲同一個鍵盤按鍵。做用和quote差很少,但可使其中部分字符串保留原解析,須要使用,放在須要保留原解析的字符串以前。this

 `(+  1 ,(+ 0 1))
  (+  1 1)

3、 #’idea

該操做符表示對函數的引用spa

4、控制結構code

 doorm

(do ((x 1 (+ x 1)) 
         (y 1 (* y 2))) 
         ((> x 5) y) 
         (print y) 
         (print 'working))            

condblog

(cond 
     ((evenp a) a) ;if a is even return a 
     ((> a 7) (/ a 2)) ;else if a is bigger than 7 return a/2 
     ((< a 5) (- a 1)) ;else if a is smaller than 5 return a-1
     (t 17)) ;else return 17 

2

case字符串

(setq x 'd)
(case x 
      (a 5) 
      ((d e) 7) 
      ((b f) 3) 
      (otherwise 9))
7
    

loop

(setq a 4)
(loop 
     (setq a (+ a 1)) 
     (when (> a 6) (return a)))

7 

if

(if t 6 5) 
6
(if nil 6 5)
5

5、block

Common Lisp 的構造區塊(block)的基本操做符:progn 、block 以及 tagbody 。

progn主體中的表達式會順序求值並返回最後一個表達式的值。

(progn
    (format t "a")
    (format t "b")
    (+ 11 12))
ab
23

block至關於帶有特別出口的progn。

(block head
    (format t "Here we go.")
    (return-from head 'idea)
    (format t "We'll never see this."))
Here we go.
IDEA

tagbody大多數迭代操做符都隱含一個tagbody。

(tagbody
    (setf x 0)
    top
      (setf x (+ x 1))
      (format t "~A " x)
      (if (< x 10) (go top)))
1 2 3 4 5 6 7 8 9 10
NIL

return宏把傳入的參數當作封閉區塊nil的返回值。

(block nil
    (return 27))
27

在一個block(明肯定義的或隱含的),不論return-from或者return都不會運行。

6、函數

可經過 symbol-function 給函數配置某個名字:

(setf (symbol-function 'add2)
  #'(lambda (x) (+ x 2)))

新的全局函數能夠這樣定義,用起來和 defun 所定義的函數同樣:

(add2 0)
 2

 

經過 defun 或 symbol-function 搭配 setf 定義的函數是全局函數。你能夠像存取全局變量那樣,在任何地方存取它們。定義局部函數也是有可能的,局部函數和局部變量同樣,只在某些上下文內能夠訪問。

局部函數可使用 labels 來定義,它是一種像是給函數使用的 let 。它的第一個實參是一個新局部函數的定義列表,而不是一個變量規格說明的列表。列表中的元素爲以下形式:

相關文章
相關標籤/搜索