是一个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