95/ 通用的結合函數,依其類型返回特定的結合函數
1 > (defun combiner (x)
? (typecase x
??? (number #'+)
??? (list #'append)
??? (t #'list)))
COMBINER
1 > (defun combine (&rest args)
? (apply (combiner (car args))
???????? args))
COMBINE
以上為函數定義,根據不同的元素類型,調用不同的函數,并返回值
1 > (combine 2 3);;;元素為數字,調用+
5
1 > (combine '(a b) '(c d));;;元素為列表,調用list
(A B C D)
96/ 調用stamp時,我們獲得一個比之前高的數字,而調用reset我們可以將計數器歸零:
2 > (let ((counter 0))
? (defun reset ()
??? (setf counter 0))
? (defun stamp ()
??? (setf counter (+ counter 1))))
STAMP;;;函數定義
2 > (list (stamp) (stamp) (reset) (stamp));;;stamp增加1,reset清零
(1 2 0 1)
2 > (list (stamp) (stamp) (stamp) (stamp) (stamp) (stamp) (reset)(stamp));;;stamp增加1,reset清零
(2 3 4 5 6 7 0 1)
97/ complement函數,接受一個謂詞,并返回謂詞的補數(complement)
2 > (mapcar (complement #'oddp);;;偶數謂詞,返回T
????????? '(1 2 3 4 5 6))
(NIL T NIL T NIL T)
2 > (mapcar (complement #'oddp);;;偶數謂詞,返回T
????????? '(1 2 3 4 5 6 8 4 7 5 3))
(NIL T NIL T NIL T T T NIL NIL NIL)
98/ 函數引用到外部定義的變量時,這外部定義的變量稱為自由變量(free variable)。
函數引用到自由的詞法變量時,稱之為閉包(closure)。[2]只要函數還存在,變量就必須一起存在。
3 > (setf fn (let ((i 3)):::變量設定fn,局部變量i
???????????? #'(lambda (x) (+ x i))));;;執行函數體,即計算x+i的值并返回該值
#<COMPILED-LEXICAL-CLOSURE #x302000D1380F>;;;自由變量定義
3 > (funcall fn 2);;;fn為自由變量
5
3 > (funcall fn 8)
11
3 > (setf fn (let ((i 6))
???????????? #'(lambda (x) (+ x i))))
#<COMPILED-LEXICAL-CLOSURE #x302000D0A20F>;;自由變量定義
3 > (funcall fn 8);;fn為自由變量
14
3 > (funcall fn 2);;fn為自由變量
8
99/ add-to-list,這函數接受一個數字及列表,并返回一個列表,列表元素是元素與傳入數字的和。
3 > (defun add-to-list (num lst);;;函數名及形參,num是自由的詞法變量
? (mapcar #'(lambda (x)
????????????? (+ x num));;;;我們傳遞了一個閉包給mapcar
????????? lst))
ADD-TO-LIST;;;自定義的函數,只要函數還存在,num變量就必定存在,隱含在函數體中,非全局變量和設定變量
3 > (add-to-list 1 '(2 4 6))
(3 5 7)
3 > num
> Error: Unbound variable: NUM;;;未知變量
> While executing: CCL::TOPLEVEL-EVAL, in process Initial(0).
> Type :GO to continue, :POP to abort, :R for a list of available restarts.
> If continued: Retry getting the value of NUM.
> Type :? for other options.
100/ 函數在被調用時,每次都返回不同的閉包。
4 > (defun make-adder (n);;;函數名及形參,n為自由變量
? #'(lambda (x)
????? (+ x n)));;;函數體,閉包傳給函數
MAKE-ADDER;;;定義函數,每次返回一個加法器(adder)
4 > (setf add3 (make-adder 3));;;定義變量,及把“每次加3的加法器”賦值到add3
#<COMPILED-LEXICAL-CLOSURE (:INTERNAL MAKE-ADDER) #x302000D2BE4F>
4 > (funcall add3 2);;;它接受一個數字,并返回一個將該數字與其參數相加的閉包(函數)
5
4 > (setf add27 (make-adder 27));;定義變量,及把“每次加27的加法器”賦值到add3
#<COMPILED-LEXICAL-CLOSURE (:INTERNAL MAKE-ADDER) #x302000D297AF>
4 > (funcall add27 2);;;它接受一個數字,并返回一個將該數字與其參數相加的閉包(函數).
29