是一個setf
能夠在同一個地方在和CLHS一個位置在弱勢族羣的PAIP?SETFable VS地方(CLHS)與位置(諾維格)
我試圖找出究竟是什麼一個地方是Common Lisp的,但給我的HyperSpec的解釋
代替正。 1.一種適合用作一般性參考的形式2.這樣的地方提到的概念位置[1]。
只是有限的幫助。
(我知道這是不是真的適合所以這類的問題,但如果有人知道一個很好的文章,解釋setfable /地點/位置我會很感激的鏈接/參考)
是一個setf
能夠在同一個地方在和CLHS一個位置在弱勢族羣的PAIP?SETFable VS地方(CLHS)與位置(諾維格)
我試圖找出究竟是什麼一個地方是Common Lisp的,但給我的HyperSpec的解釋
代替正。 1.一種適合用作一般性參考的形式2.這樣的地方提到的概念位置[1]。
只是有限的幫助。
(我知道這是不是真的適合所以這類的問題,但如果有人知道一個很好的文章,解釋setfable /地點/位置我會很感激的鏈接/參考)
最初的可變數據結構具有getter和一個setter。例如用於car
/rplaca
和cdr
/rplacd
:
CL-USER 68 > (let ((a (cons 1 2)))
(print (list (car a) (cdr a)))
(rplaca a 'foo)
(rplacd a 'bar)
(print (list (car a) (cdr a)))
(values))
(1 2)
(FOO BAR)
在這個例子中,吸氣是缺點細胞car
和cdr
。 安裝人員是rplaca
(替換汽車)和rplacd
(替換cdr)。
每個可變數據結構都有這樣的結構,通常沒有系統的方法來從知道getter的名字來猜測setter的名字。
因此,這個想法是有一個getter和setter的註冊表。爲getter註冊一個setter,用戶只需要知道getter。 setf
宏(以及其他類似incf
,decf
以及用戶定義的宏)然後查找所使用的getter的setter。
以上的setf
宏看起來像這樣的例子:
CL-USER 69 > (let ((a (cons 1 2)))
(print (list (car a) (cdr a)))
(setf (car a) 'foo)
(setf (cdr a) 'bar)
(print (list (car a) (cdr a)))
(values))
(1 2)
(FOO BAR)
正如你看到使用的rplaca
和rplacd
已取代了setf
宏。
因此,一個地方基本上是一個註冊表格,其中有一個註冊表。 defsetf和define-setf-expander用於此。
define-modify-macro是用來定義一個宏,它可以修改一個地方。
例如,我們可以定義一種乘以地點值的方法,類似於incf
(增加地點)和decf
(遞減地點)。
此功能是舊的,原本字字段被用來代替地方。因此,能夠使用地址的宏以f(字段)結束。
CL-USER 71 > (define-modify-macro multf (&rest args)
* "multiply")
MULTF
CL-USER 72 > (let ((a (cons 1 2)))
(print (list (car a) (cdr a)))
(multf (car a) 2)
(multf (cdr a) 4)
(print (list (car a) (cdr a)))
(values))
(1 2)
(2 8)
你讀過CLHS [5.1歸納參考](http://www.lispworks.com/documentation/HyperSpec/Body/05_a.htm)? – jkiiski