2017-04-16 38 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)