2020-03-29lisp學(xué)習(xí)-20

95/ 通用的結(jié)合函數(shù),依其類型返回特定的結(jié)合函數(shù)

1 > (defun combiner (x)
? (typecase x
??? (number #'+)
??? (list #'append)
??? (t #'list)))
COMBINER
1 > (defun combine (&rest args)
? (apply (combiner (car args))
???????? args))
COMBINE

以上為函數(shù)定義,根據(jù)不同的元素類型,調(diào)用不同的函數(shù),并返回值

1 > (combine 2 3);;;元素為數(shù)字,調(diào)用+
5
1 > (combine '(a b) '(c d));;;元素為列表,調(diào)用list
(A B C D)

96/ 調(diào)用stamp時(shí),我們獲得一個(gè)比之前高的數(shù)字,而調(diào)用reset我們可以將計(jì)數(shù)器歸零:

2 > (let ((counter 0))
? (defun reset ()
??? (setf counter 0))
? (defun stamp ()
??? (setf counter (+ counter 1))))
STAMP;;;函數(shù)定義
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函數(shù),接受一個(gè)謂詞,并返回謂詞的補(bǔ)數(shù)(complement)

2 > (mapcar (complement #'oddp);;;偶數(shù)謂詞,返回T
????????? '(1 2 3 4 5 6))
(NIL T NIL T NIL T)
2 > (mapcar (complement #'oddp);;;偶數(shù)謂詞,返回T
????????? '(1 2 3 4 5 6 8 4 7 5 3))
(NIL T NIL T NIL T T T NIL NIL NIL)

98/ 函數(shù)引用到外部定義的變量時(shí),這外部定義的變量稱為自由變量(free variable)。

函數(shù)引用到自由的詞法變量時(shí),稱之為閉包(closure)。[2]只要函數(shù)還存在,變量就必須一起存在。

3 > (setf fn (let ((i 3)):::變量設(shè)定fn,局部變量i
???????????? #'(lambda (x) (+ x i))));;;執(zhí)行函數(shù)體,即計(jì)算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,這函數(shù)接受一個(gè)數(shù)字及列表,并返回一個(gè)列表,列表元素是元素與傳入數(shù)字的和。

3 > (defun add-to-list (num lst);;;函數(shù)名及形參,num是自由的詞法變量
? (mapcar #'(lambda (x)
????????????? (+ x num));;;;我們傳遞了一個(gè)閉包給mapcar
????????? lst))
ADD-TO-LIST;;;自定義的函數(shù),只要函數(shù)還存在,num變量就必定存在,隱含在函數(shù)體中,非全局變量和設(shè)定變量
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/ 函數(shù)在被調(diào)用時(shí),每次都返回不同的閉包。

4 > (defun make-adder (n);;;函數(shù)名及形參,n為自由變量
? #'(lambda (x)
????? (+ x n)));;;函數(shù)體,閉包傳給函數(shù)
MAKE-ADDER;;;定義函數(shù),每次返回一個(gè)加法器(adder)
4 > (setf add3 (make-adder 3));;;定義變量,及把“每次加3的加法器”賦值到add3
#<COMPILED-LEXICAL-CLOSURE (:INTERNAL MAKE-ADDER) #x302000D2BE4F>
4 > (funcall add3 2);;;它接受一個(gè)數(shù)字,并返回一個(gè)將該數(shù)字與其參數(shù)相加的閉包(函數(shù))
5
4 > (setf add27 (make-adder 27));;定義變量,及把“每次加27的加法器”賦值到add3
#<COMPILED-LEXICAL-CLOSURE (:INTERNAL MAKE-ADDER) #x302000D297AF>
4 > (funcall add27 2);;;它接受一個(gè)數(shù)字,并返回一個(gè)將該數(shù)字與其參數(shù)相加的閉包(函數(shù)).
29

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容