發新話題
打印

[Lisp] 常用函數

推到噗浪
推到臉書

[Lisp] 常用函數

lisp 語法及變數皆不分大小寫(case insensitive)。



NIL
空串列,相當於 '() 。另外真偽值表示時, T 表真, NIL 表偽。只要是任何不是 NIL (空串列) 的值,真偽值都表示真。


QUOTE
複製內容到剪貼板
代碼:
(QUOTE 參數)
將參數直接傳回,不做任何評估動作。可用 ' (單引號)取代


SETQ, SETF, LET
複製內容到剪貼板
代碼:
(SETQ 參數1 參數2)

(SETF 參數1 參數2)

(LET ((變數1名稱  變數1的值)
         (變數2名稱  變數2的值)
          ........
        )
        變數1,2...的作用範圍,既程式執行敘述
)
SETQ, SETF 將參數1的值連結至參數2。 LET 只有在作用範圍內有效。
註: SetQ => set quote; SetF => set form
註: 全域變數習慣用兩個 * 把變數名稱包起來,例如 *globe-variable*


CAR, CDR
複製內容到剪貼板
代碼:
(CAR 串列參數)
(CDR 串列參數)
CAR 取得參數串列的第一個元素;CDR 取得扣掉第一個元素之後的新串列。


CONS
複製內容到剪貼板
代碼:
(CONS 參數1 參數串列2)
把參數1 加到參數串列2 的第一個元素,產生出新的串列。
對任一串列 A 而言, (CONS (CAR A) (CDR A)) 即為 A 。
註:如果第二個參數不是串列,則會產生出點對,故少用。


APPEND
複製內容到剪貼板
代碼:
(APPEND 參數串列1 參數串列2 ........ )
合併若干參數串列,形成新的串列。
註:如果最後一個參數不是串列,也會形成尾巴是帶點的串列,故少用。


LIST
複製內容到剪貼板
代碼:
(LIST 參數1 ........ )
將若干參數,當作是新串列的元素,形成新串列。
註: APPEND 除了最後一個之外的參數皆需為串列,而 LIST 不用。


NULL
複製內容到剪貼板
代碼:
(NULL 參數)
判斷參數是否為空串列(NIL)。


ATOM, LISTP, NUMBERP, ZEROP
複製內容到剪貼板
代碼:
(ATOM 參數)
(LISTP 參數)
(NUMBERP 參數)
(ZEROP 參數)
判斷參數是否為 atom(原子), list(串列), number(數字), zero(0) , ZEROP 的參數必須為數字。


LENGTH
複製內容到剪貼板
代碼:
(LENGTH 參數串列)
計算參數串列內的元素有幾個。


REVERSE
複製內容到剪貼板
代碼:
(REVERSE 參數串列)
將參數串列內的元素順序反過來,切記,它只會反轉第一層的元素。


EQUAL
複製內容到剪貼板
代碼:
(EQUAL 參數1 參數2)
比較兩參數是否相等。


=, >, <, >=, <=
複製內容到剪貼板
代碼:
(= 參數1 參數2)
(> 參數1 參數2)
(< 參數1 參數2)
(>= 參數1 參數2)
(<= 參數1 參數2)
功用正如你所想,傳回值是 T 或是 NIL 。


NOT, AND, OR
複製內容到剪貼板
代碼:
(NOT 參數)
(AND 參數1 參數2 ...... )
(OR 參數1 參數2 ...... )
功用正如你所想。AND 由左至右搜尋是否有 NIL ,碰到第一個滿足的元素時,就停止搜尋,然後傳回 NIL ,不然等搜尋到最後一個之後,最後一個參數就會被傳回來啦。同理, OR 會搜尋第一個非 NIL 的元素,然後就停止搜尋,把那個元素當做傳回值啦。


(to be continued... )

TOP

IF, COND
複製內容到剪貼板
代碼:
(IF  測試條件  測試條件為真的執行敘述   測試條件為偽的執行敘述)


(COND ((測試條件1) (待執行敘述1))
((測試條件2) (待執行敘述2))
......
((測試條件n) (待執行敘述n))
)
由測試條件1~測試條件n逐一檢查,發現的第一個滿足的測試條件k,就執行之後的待執行敘述k,執行之後,即終止測試,並跳出此 COND 敘述。
註:下面使用方法,類似一般語言的 if-then-else 使用方式
複製內容到剪貼板
代碼:
(COND ((測試條件1) (待執行敘述1))
( T (待執行敘述2))
)
DEFUN
複製內容到剪貼板
代碼:
(DEFUN 函數名稱 (參數1 參數2 ... )
(執行敘述1)
(執行敘述2)
.........
)
函數定義啦!如果有需要遞迴定義的話,請直接使用函數名稱。
範例:
複製內容到剪貼板
代碼:
(DEFUN factorial (N)
    (COND ((= N 0) 1)
          (T (* N (factorial (- N 1))))
    )
)

使用時候:
(factorial 5)
傳回結果:
120

TOP

發新話題