書籍下載地址: Ansi Common Lisp 中文版|百度網盤 實用Common.Lisp編程 .pdf|百度網盤 LISP指令速查網站推薦: Simplified Common Lisp reference (jtra.cz) 我製作的表格: 由於Common LISP命令很多,經常忘,所以做 ...
書籍下載地址:
LISP指令速查網站推薦:
Simplified Common Lisp reference (jtra.cz)
我製作的表格:
由於Common LISP命令很多,經常忘,所以做個這個表格,方便速查。
表格中命令的順序基本為ANSI Common LISP這本書中命令出現的順序。
命令 | 含義 | 例子 |
---|---|---|
T | 真 | |
NIL | 假 | |
+-*/ | 加減乘除 | > (+ 2 3 4) 9 |
>和< | 大於和小於 | > (> 2 1) T |
CHAR<和CHAR> | 字元比較 | |
** | 全局變數需要左右加上星號 | > (setf *print-array* t) T |
ZEROP | 為0時返回真 | |
CHARACTERP | 是否為字元 | |
/= | 不相等 | |
= | 判斷相等(建議到這個網站查看具體解釋)。僅能判斷數字。 | > (= 4 4.0) T |
EQ | 是否完全相同。內容相同但是記憶體位置不同也為不同。不用於數字。 | > (eq (cons 'a 'b) (cons 'a 'b)) NIL > (eq 'a 'a) T |
EQL | 與EQ相似。可以比較數字。 | |
EQUAL | 是否內容相同。記憶體位置可以不同。字元串大小寫敏感 | > (equal (list 1 (cons 2 3)) (list 1 (cons 2 (+ 2 1)))) T |
EQUALP | 字元串大小寫不敏感 | |
AND OR NOT | 邏輯與、或、非 | |
ODDP | 是否為奇數 | |
EVENP | 是否為偶數 | |
QUOTE(`) | 不求值 | > `(+ 1 2) (+ 1 2) |
CONS | 構建一個長度為2的列表 (但第二個輸入值可以是一個列表) |
> (cons 'a '(b c d)) (A B C D) |
CONSP | 判斷是否為CONS | |
LIST | 構建一個列表 | |
CAR | 獲取列表第一個元素 | |
CDR | 獲取列表第二個以及 之後的元素構成的列表 |
|
THIRD | 獲取列表第三個元素 | |
LISP | 判斷輸入是否為列表 | |
NULL | 判斷是否為空表或NIL | |
IF | IF | |
DEFUN | 聲明全局函數 | (defun our-third (x) (car (cdr (cdr x)))) 調用時:(our-third (1 2 3)) |
(DEFUN的參數列表 | ||
&rest | 剩餘的參數。會被包裝為列表。 | (defun our-funcall (fn &rest args) (apply fn args)) |
&optional | 可選參數 | (defun philosoph (thing &optional (property 'fun)) (list thing 'is property)) |
&key | 關鍵字參數 | > (defun keylist (a &key x y z) (list a x y z)) KEYLIST > (keylist 1 :y 2) (1 NIL 2 NIL) |
) | ||
EQL | 相等判斷 | |
FORMAT | 輸出 | > (format t "~A plus ~A equals ~A. ~%" 2 3 (+ 2 3)) 2 PLUS 3 EQUALS 5 NIL |
~A | 數據輸出的位置,相當於C語言的%d | |
~% | 換行符 | |
READ | 輸入 | > let ((val (read)) |
LET | 定義局部變數 | > (let ((x 1) (y 2)) (+ x y)) 3 |
DEFPARAMETER | 創建全局變數(變數需要加星號) | > (defparameter *glob* 99) |
DEFCONSTANT | 定義全局常量(不需要星號) | |
BOUNDP | 判斷是否為全局變數或常量 | > (boundp '*glob*) T |
SETF | 賦值(給全局或局部變數),可以創建全局變數 | |
INCF | 自加。相當於c的++ | |
REMOVE | 返回不包含這個對象的新列表,但不改變原列表 | > (setf lst '(c a r a t)) (C A R A T) > (remove 'a lst) (C R T) |
DELETE | REMOVE的破壞性版本。但不能保證所需移除的元素都能移除。 | > (setf lst '(a r a b i a) ) (A R A B I A) > (delete 'a lst ) (R B I) > lst (A R B I) |
DO | 迴圈 (DO (變數定義) (結束條件 返回值) 迴圈主體) 其中變數定義為(變數名 變數初值 (變數變化語句)) |
(defun show-squares (start end) (do ((i start (+ i 1))) ((> i end) 'done) (format t "~A A%" i (* i i)))) |
DOTIMES | 迴圈次數 | (dotimes (x 5 x) (format t "~A " x)) 0 1 2 3 4 5;; 第一行第二個x是返回值,可以不加 |
LOOP | 迴圈巨集 | > (loop for x from 0 to 9 do (princ x)) 0123456789 NIL > (loop for x = 8 then (/ x 2) until (< x 1) do (princ x)) 8421 NIL |
(defun sumx (n) (loop for x from 1 to n sum x));;返回從1加到n的結果 |
||
> (loop for x from 1 to 5 collect (random 10)) (3 8 6 5 0) |
||
(defun even/odd (ns) (loop for n in ns if (evenp n) collect n into evens else collect n into odds finally (return (values evens odds)))) > (even/odd '(1 2 3 4)) (2 4) (1 3) |
||
PROGN | 接受任意數量的表達式,依序對它們求值,並返回最後一個值。 | |
DOLIST | for each... | > (dolist (obj lst) 相當於C++的for(auto obj:lst){,相當於Python的for obj in lst: |
FUNCTION(#') | 把函數當做實參傳入 | |
APPLY | 接受函數和實參列表,並返回把傳入函數應用在後面實參的結果 | > (apply #'+ '(1 2 3)) 6 |
FUNCALL | 功能和APPLY相同,但實參不需要包裝成列表。 | > (funcall #'+ 1 2 3) 6 |
LAMBDA | Lambda表達式 | (lambda (x y) (+ x y)) > (funcall #'(lambda (x) (+ x 100)) 1) |
TYPEP | 判斷是否為某種類型 | > (typep 27 'integer) T |
COPY-LIST | 返回列表的複製 | |
ATOM | 驗證一個項是否為原子(即列表的一個項) | |
APPEND | 返回列表串接 | > (append '(a b) '(c d) 'e) (A B C D E) |
NCONC | 返回列表串接並更新第一個列表的最後一個 cons 單元的 next 指針。 | > (let ((l1 (list 1 2 3)) (l2 (list 4 5 6))) (nconc l1 l2) l1) (1 2 3 4 5 6) |
NTH | 通過索引獲取列表元素 | > (nth 0 '(a b c)) A |
NTHCDR | 找到第n個CDR | > (nthcdr 2 `(a b c d e)) (C D E) |
LAST | 返回列表最後一個CONS對象 | > (last '(a b c)) (C) |
LAST的CAR | 返回列表的最後一個元素 | > (car (last '(a b c))) C |
SECOND | 返回第二個元素 | |
CADR | 返回第二個元素(相當於CDR的CAR) | |
CADDR | 返回第三個元素(相當於CDR的CDR的CAR)可以無限加D。 | |
MAPCAR | 返回把函數應用到列表每個元素的結果 | > (mapcar #'(lambda (x) (+ x 10)) '(1 2 3)) (11 12 13) |
MAPCAN | 類似MAPCAR。但它返回值是用NCONC拼接在一起的。 | |
MAPC | 把函數應用到列表每個元素,返回原來的列表 | |
MAP | 把函數應用到列表每個元素,可定義返回的類型。 | (map 'list (lambda (x) (+ x 10)) '(1 2 3 4)) (11 12 13 14) |
MAP-INTO | 把函數應用到列表每個元素,第一個參數不是一個序列類型,而是用來存儲結果的。 | > (let ((a (list 1 2 3 4))) (map-into a #'* a a) a) (1 4 9 16) 還可以:(setf v (map-into v #'1+ v)) |
MAPLIST | 將列表的漸進的下一個 CDR傳入函數 | > (maplist #'(lambda (x) x) '(a b c)) ((A B C) (B C) (C)) |
MEMBER | 判斷元素是否為列表的成員。可以傳入參數:TEST和:KEY | > (member 'b '(a b c)) (B C) > (member '(a) '((a) (z)) :test #'equal) ((A) (Z)) > (member 'a '((a b) (c d)) :key #'car) ((A B) (C D)) ;;在這個例子里,我們詢問是否有一個元素的CAR是 a |
MEMBER-IF | 返回由滿足條件的元素構成的列表 | > (member-if #'oddp '(2 3 4)) (3 4) |
ADJOIN | 如果對象還不是列表的,成員,構建對象至列表上 | > (adjoin 'b '(a b c)) (A B C) > (adjoin 'z '(a b c)) (Z A B C) |
UNION | 並集 | |
INTERSECTION | 交集 | |
SET-DIFFERENCE | 補集 | > (set-difference '(a b c d e) '(b e)) (A C D) |
LENGTH | 返回元素的數目 | |
SUBSEQ | 獲取列表的一部分,相當於其他語言的Slice | > (subseq '(a b c d) 1 2) (B) >(subseq '(a b c d) 1) (B C D) |
REVERSE | 列表反轉 | |
NREVERSE | 使原列表反轉? | |
EVERY | 判斷列表每個元素都滿足條件 | > (every #'oddp '(1 3 5)) T |
SOME | 判斷列表部分元素滿足條件 | > (some #'evenp '(1 2 3)) T |
PUSH | 把元素插入列表的前端 | |
POP | 移除列表的第一個元素,並返回這個元素 | |
ASSOC | 返回列表中CAR為指定元素的列表 | > (setf min '((a b c) (b c) (c d))) > (cdr (assoc 'a min)) (B C) |
MAKE-ARRAY | 構造數組 | > (setf arr (make-array '(2 3) :initial-element nil)) ;;構造了一個2x3的數組 |
AREF | 通過索引獲取數組元素 | > (setf (aref arr 0 0) 'b) B> (aref arr 0 0) B |
#na | 表示字面常量的數組,其中n是數組的維度 | #2a((b nil nil) (nil nil nil)) |
VECTOR | 向量 | > (vector "a" 'b 3) |
VECTOR-PUSH | 把元素插入向量的前端 | |
VECTOR-POP | 移除向量的第一個元素,並返回這個元素 | |
SVREF | 通過索引獲取向量元素 | |
SORT | 字元串排序 | > (sort "elbow" #'char<) "below" |
CHAR | 通過索引獲取字元串元素 | |
COPY-SEQ | 返回序列(字元串)的複製 | |
CONCATENATE | 連接 | > (concatenate 'string "not " "to worry") "not to worry" |
TAILP | 如果第一個列表是第二個列表的一部分,則返回T | |
ELT | 通過索引獲取任何種類的序列元素。針對特定類型的序列,特定的存取函數會比較快,所以使用 elt 是沒有意義的,除非在代碼當中,有需要支持通用序列的地方。 | |
POSITION | 返回序列中一個元素的位置,未找到元素時返回 nil。參數:start :end :test | > (position #\a "fantasia") 1> (position #\a "fantasia" :start 3 :end 5) 4 > (position 3 '(1 0 7 5) :test #'<) 2 |
SUBSEQ | 獲取子串(SUBSEQ STR P1 P2) | |
POSITION-IF | 返回第一個滿足此函數的元素 | > (position-if #'oddp '(2 3 4 5)) 1 |
FIND | 返回要尋找的對象 | > (find #\a "cat") #\a |
FIND-IF | 返回要尋找的滿足函數的對象 | > (find-if #'characterp "ham") #\h |
REMOVE-DUPLICATES | 僅保留序列中每個元素的最後一次出現。 | |
REDUCE | 把序列壓縮成一個值 | (reduce #'fn '(a b c d))等同於(fn (fn (fn 'a 'b) 'c) 'd) |
DEFSTRUCT | 定義結構體 | (defstruct point x y) |
MAKE-HASH-TABL | 創建哈希表,無需參數。 | > (setf ht (make-hash-table)) |
GETHASH | 獲取一個鍵值 | > (setf (gethash 'color ht) 'red) RED |
REMHASH | 從一個哈希表中移除一個詞條,若返回T,說明有詞條被移除 | |
BLOCK | 塊 | |
RETURN-FROM | 返回塊 | > (block head (format t "Here we go.") (return-from head 'idea) (format t "We'll never see this.")) Here we go. IDEA |
RETURN | 返回 | |
TAGBODY | ||
GO | 相當於其他語言的goto。需要在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 |
LET* | 相當於嵌套版本的LET,可以依賴一個表達式設立另一個變數。可以把x設為1,同時把y設為x+1.原版LET就不行。 | |
WHEN | 當測試為真時,對主體求值 | |
UNLESS | 僅在測試表達式返回假時,才對主體求值 | |
CASE | 相當於C語言的switch | (defun month-length (mon) (case mon ((jan mar may jul aug oct dec) 31) ((apr jun sept nov) 30) (feb (if (leap-year) 29 28)) (otherwise "unknown month"))) |
TYPECASE | 按照類型來switch | (TYPECASE X (NUMBER (* X 2))) |
VALUES | 返回多個值 | |
MULTIPLE-VALUE-BIND | 綁定多個值。如果變數的數量大於數值的數量,剩餘的變數會是 nil 。如果數值的數量大於變數的數量,多餘的值會被捨棄。 | |
CATCH | 捕獲異常 | (defun super () (catch 'abort (sub) (format t "We'll never see this."))) (defun sub () (throw 'abort 99)) > (super) 99 |
THROW | 拋出異常 | |
ERROR | 拋出異常文字 | (ERROR "Oops!") |
UNWIND-PROTECT | 使程式不會被報錯打斷 | (UNWIND-PROTECT |
FBOUNDP | 是否有函數與給定符號綁定 | > (fboundp '+) T |
SYMBOL-FUNCTION | 返回函數。可用於給函數配置某個名字。 | (setf (symbol-function 'add2) #'(lambda (x) (+ x 2))) > (add2 1) 3 |
DOCUMENTATION | 獲取函數的文檔字串 | > (DOCUMENTATION #'+ 'function) "sum of its arguments. With no args, returns 0." |
LABELS | 聲明局部函數。用法與DEFUN一樣。 | |
COND | 直到某個條件為真時才返回 | > (cond ((> 3 4) "variant 1") ((> 4 2) "variant 2") (t "always valid variant")) "variant 2" |
DECLARE(SPECIAL x) | 使x為動態作用域(詳見ANSI COMMON LISP 76頁) | |
COMPILED-FUNCTION-P | 檢查函數是否已被編譯 | |
COMPILE | 編譯函數 | |
COMPILE-FILE | 編譯文件 | |
MAKE-PATHNAME | 新建一個路徑。參數有host, device, directory, name, type 以及 version | > (setf path (make-pathname :name "myfile")) |
OPEN | 打開文件流。需要一個路徑和大量選擇性關鍵字參數。 | > (setf str (open path :direction :output :if-exists :supercede)) ;;supercede表示取代。output表示寫文件。input表示讀文件。 |
CLOSE | 關閉文件 | |
READ-LINE | 從文件流中讀一行。若不指定文件流,則從標準輸入中讀一行,相當於READ。 | |
WITH-OPEN-FILE | 相當於Python的with,不需要close,保證文件能夠關閉。 | (with-open-file (str path :direction :output :if-exists :supercede) (format str "Something~%"));;向文件寫入Something\n |
PRIN1 | 輸出包含雙引號。給程式產生輸出。 | |
PRINC | 輸出不包含雙引號。給人類產生輸出。 | |
SYMBOL-NAME | 獲取符號名 | > (symbol-name 'abc) "ABC" |
垂直杠之間的字元序列將被視為符號。 | ||
SYMBOL-PLIST | 獲取符號的屬性列表(PLIST) | > (setf (get 'alizarin 'color) 'red) RED > (get 'alizarin 'color) RED > (setf (get 'alizarin 'transparency) 'high) HIGH > (symbol-plist 'alizarin) (TRANSPARENCY HIGH COLOR RED) |
DEFPACKAGE | 定義包 | (defpackage "MY-APPLICATION" (:use "COMMON-LISP" "MY-UTILITIES") (:nicknames "APP") (:export "WIN" "LOSE" "DRAW")) (in-package my-application) 這段代碼定義了新包my-application,使用了兩個包,COMMON-LISP和MY-UTILITIES,一個昵稱為APP,這樣背的包可以這樣引用符號APP:WIN。包本身只輸出三個符號"WIN"、"LOSE"和"DRAW"。 |
IN-PACKAGE | 包結尾 | |
FLOAT | 將任何實數轉換為浮點數 | |
TRUNCATE | 返回任何實數的整數部分 | |
FLOOR | 返回小於等於參數的最大整數 | |
CEILING | 返回大於等於參數的最小整數 | |
ROUND | 返回最接近參數的整數 | > (mapcar #'round '(-2.5 -1.5 1.5 2.5)) (-2 -2 2 2);;不做五入,而是取最近的偶數 |
RANDOM | 接受一個整數或浮點數。返回一個小於n的數字 | |
SIGNUM | 返回參數的符號。可以返回-1,0或1 | |
FLOAT | 轉換為浮點數 | > (/ 365 12) 365/12;;比值 > (float 365/12) 30.416666 |
EXPT | (expt x n) = x^n | |
LOG | (log x n) = \(\log_{n}x\), 若預設n,則n預設為e | |
EXP | (exp x) = e^x | |
SQRT | 平方根 | |
SIN、COS、TAN | 三角函數 | |
ASIN、ACOS、ATAN | 反三角函數 | |
SINH、COSH、TANH | 雙曲函數 | |
ASINH、ACOSH、ATANH | 反雙曲函數 | |
PI | 常數π | |
short-float短浮點、single-float單精度浮點、double-float雙精度浮點、long-float長浮點 | ||
MOST-POSITIVE-FIXNUM最大整數、MOST-NAGATIVE-FIXNUM最小整數 | (不同實現下不同) | |
EVAL | 與Python的eval功能相同。可把列表視作代碼 | > (eval '(+ 1 2 3)) 6 |
DEFMACRO | 聲明巨集 | (defmacro nil! (x) (list 'setf x nil)) 也可定義為: (defmacro nil! (x) `(setf ,x nil)) > (nil! x) NIL > x NIL |
MACROEXPAND-1 | 展開巨集(用於測試) | > (macropexpand-1 '(nil! x)) (SETF X NIL) T |
, | 在反引號表達式中重啟求值 | > (setf a 1 b 2) 2> > `(a is ,a and b is ,b) (A IS 1 AND B IS 2) |
,@ | 與逗號相似,但將其(本來應該是列表的)參數扒開。 | > (setf lst '(a b c)) (A B C) > `(lst is ,lst) (LST IS (A B C)) > `(its elements are ,@lst) (ITS ELEMENTS ARE A B C) |
GENSYM | 自由符號。保證巨集定義的變數不會與外面的變數重名。 | (defmacro ntimes (n &rest body) (let ((g (gensym)) (h (gensym))) `(let ((,h ,n)) (do ((,g 0 (+ ,g 1))) ((>= ,g ,h)) ,@body)))) |
DEFCLASS | 聲明類 | (defclass circle () (radius center));;這說明類circle的實例包含兩個槽,分別名為radius和center. |
MAKE-INSTANCE | 創建類的實例 | > (setf c (make-instance 'circle)) |
SLOT-VALUE | 槽的值 | > (setf (slot-value c 'radius) 1) |
(槽的屬性 | ||
:accessor、:writer、:reader | 可讀寫、可寫、可讀 | (defclass circle () ((radius :accessor circle-radius) (center :accessor circle-center))) > (setf c (make-instance 'circle)) #<CIRCLE #XC5C726> > (setf (circle-radius c) 1) 1 > (circle-radius c) 1 |
:initarg | 定義參數名 | |
:initform | 定義預設值 | (defclass circle () ((radius :accessor circle-radius :initarg :radius :initform 1) (center :accessor circle-center :initarg :center :initform (cons 0 0)))) > (setf c (make-instance 'circle :radius 3)) #<CIRCLE #XC2DE0E> > (circle-radius c) 3 > (circle-center c) (0 . 0) |
:acclocation :class | 定義類變數 | (defclass tabloid () ((top-story :accessor tabloid-story :allocation :class))) > (setf daily-blab (make-instance 'tabloid) unsolicited-mail (make-instance 'tabloid)) #<TABLOID #x302000EFE5BD> > (setf (tabloid-story daily-blab) 'adultery-of-senator) ADULTERY-OF-SENATOR > (tabloid-story unsolicited-mail) ADULTERY-OF-SENATOR |
) | ||
DEFMETHOD | 定義方法。支持重載,甚至可以對單一的對象做特化。 | (defmethod combine ((x number) (y number)) (+ x y) (defmethod combine ((x (eql 'powder)) (y (eql 'spark))) 'boom) |
:before :after :around | 標準方法組合機制(standard method combination)規定,調用一個函數會調用:around方法,如果有的話;否則,依序調用:before方法、主方法、:after方法 | |
DECLARE、DECLAIM | 聲明(局部、全局)。 | |
DECLARE(OPTIMIZE (SPEED 3) (SAFTEY 0)) | 編譯參數。speed 0~3。3最快。作用在函數里。 | (declaim (optimize (speed 3) (compilation-speed 0) (safety 0) (debug 0)));;這塊代碼讓所有代碼在任何情況下都儘可能更快。 |
(DECLAIM(INLINE x)) | 使函數x為內聯函數。能提高運行速度。遞歸函數不能內聯。 | (declaim (inline single?)) (defun single? (lst) (and (consp lst) (null (cdr lst)))) |
(DECLAIM (FIXNUM x)) | 聲明x為定長數(整數)。 | (defun poly (a b x) (declare (fixnum a b x)) (+ (* a (expt x 2)) (* b x))) |
(declare (type (vector fixnum 20) v));; 聲明瞭一個僅含有定長數,企鵝長度固定為20的向量。 | ||
(常見函數及其破壞性版本 | ||
安全 | 破壞性 | |
append | nconc | |
reverse | nreverse | |
remove | delete | |
remove-if | delete-if | |
remove-duplicates | delete-duplicates | |
subst | nsubst | |
subst-if | nsubst-if | |
union | nunion | |
intersection | nintersection | |
set-difference | nset-difference | |
) | ||
DEFTYPE | 定義類型標識符 | (deftype multiple-of (n) `(and integer (satisfies (lambda (x) (zerop (mod x ,n)))))) > (type 12 '(multiple-of 4)) T;;定義了4的倍數的標識符 |
PACKAGE-NAME | 返回包的名字 | |
FIND-PACKAGE | 返回一個給定名稱的包 | > (find-package "COMMON-LISP-USER") #<Package "COMMON-LISP-USER" 4CD15E> |
SYMBOL-PACKAGE | 接受一個符號並返回該符號被 interned 的包 | |
EXPORT | 使符號對其他包可視(可用單冒號訪問,不可視時只能用雙冒號訪問) | |
IMPORT | 導入包 | |
USE-PACKAGE | 使用包 | |
TRACE | 追蹤函數,用於調試,可在每次函數調用時顯示輸入的參數 | |
UNTRACE | 取消追蹤函數 | |
本文來自博客園,作者:mariocanfly,轉載請註明原文鏈接:https://www.cnblogs.com/mariocanfly/p/16584882.html