2017-04-16 37 views
2

是一個setf能夠在同一個地方和CLHS一個位置在弱勢族羣的PAIP?SETFable VS地方(CLHS)與位置(諾維格)

我試圖找出究竟是什麼一個地方是Common Lisp的,但給我的HyperSpec的解釋

代替正。 1.一種適合用作一般性參考的形式2.這樣的地方提到的概念位置[1]。

只是有限的幫助。

(我知道這是不是真的適合所以這類的問題,但如果有人知道一個很好的文章,解釋setfable /地點/位置我會很感激的鏈接/參考)

+2

你讀過CLHS [5.1歸納參考](http://www.lispworks.com/documentation/HyperSpec/Body/05_a.htm)? – jkiiski

回答

6

最初的可變數據結構具有getter和一個setter。例如用於car/rplacacdr/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) 

在這個例子中,吸氣是缺點細胞carcdr。 安裝人員是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) 

正如你看到使用的rplacarplacd已取代了setf宏。

因此,一個地方基本上是一個註冊表格,其中有一個註冊表。 defsetfdefine-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)