是一种setf能够在同一个地方在CLHS和位置在弱势族群的PAIP?
我试图找出Common Lisp中究竟是什么地方,但对我来说是HyperSpec的解释
地方 1.一种适合用作一般参考的表格.2.这样一个地方提到的概念位置[1].
只是有限的帮助.
(我知道这不是那种适合SO的问题,但如果有人知道一篇解释setfable/place/location的好文章,我会很感激链接/参考)
最初可变数据结构有一个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)
Run Code Online (Sandbox Code Playgroud)
在这个例子中,吸气是car和cdr用于缺点细胞.安装者是rplaca(替换汽车)和rplacd(替换cdr).
每个可变数据结构都具有这一点,并且通常没有系统的方法来从知道getter的名称来猜测setter的名称.
因此,我们的想法是拥有一个getter和setter的注册表.为getter注册一个setter,用户只需知道getter.的setf宏(和其他类似incf,decf并且还包括用户定义的宏),那么确实设定器对于所使用的吸气剂的查找.
上面的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)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样,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)
Run Code Online (Sandbox Code Playgroud)