setf function的问题,谢谢
还是practical common lisp中遇到的
在第十七章的accessor function那一节中
书上说,A SETF function is a way to extend SETF, defining a new kind of place that it knows how to set. The name of a SETF function is a two-item list whose first element is the symbol setf and whose second element is a symbol, typically the name of a function used to access the place the SETF function will set. A SETF function can take any number of arguments, but the first argument is always the value to be assigned to the place.
然后他的定义
(defun (setf customer-name) (name account)
(setf (slot-value account 'customer-name) name))
可是他调用的时候
(setf (customer-name my-account) "Sally Sue")
还说展开之后,Sally Sue对应于name, my-account对应于account
我不明白,函数的定义与调用是怎么联系起来的
谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
谢谢老大
现在清楚多了,只是觉得这个语法怪怪的,还是因为受c的毒害太深阿
我不用楼主的例子,因为那里的代码不全。
下面出现的代码在 clisp 上测试过。
一、setf 函数举例
setf 函数为指定的取值函数定义一个伴随的赋值操作。以 car 为例。
复制代码
(car x) 取值, (setf (car x) ...) 赋值。
二、自定义 setf 函数
car 的这个性质是默认的。如果自己实现一个函数,还会有这种性质吗?
复制代码
出错了,因为没有为 mycar 登记一个 setf 函数。现在来登记一个
复制代码
value 和 list 是 setf 函数使用的参数。当解释器看到 (setf (mycar ... ) value) 时,它根据 setf 和 mycar 得到函数 (setf mycar) 并作用在参数 value 和 list 上。setf 函数可以有多个参数,但 value 位置是要赋予的值,而其它参数是用来定位的。
三、小结
再回过头来看一看我一开始说的:setf 函数为指定的取值函数定义一个伴随的赋值操作。
这句话并不全对,但一般都这样用而已。这就好比你定义两个函数: = 和 !=, 那么它们理应有一定的约束关系,但语言并不强制这一点。排除习惯用法,单从语言本身看, (setf mycar) 函数跟 mycar 函数没有必然联系。这个体现在:
1、 即使 mycar 没有定义,仍可以定义一个 (setf mycar);
2、 可以修改 (setf mycar) 的定义,使它有其它的行为。
[ 本帖最后由 win_hate 于 2009-7-10 17:16 编辑 ]