免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3919 | 回复: 2
打印 上一主题 下一主题

setf function的问题,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-10 11:35 |只看该作者 |倒序浏览
还是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

我不明白,函数的定义与调用是怎么联系起来的
谢谢

论坛徽章:
0
2 [报告]
发表于 2009-07-10 17:11 |只看该作者
我不用楼主的例子,因为那里的代码不全。

下面出现的代码在  clisp 上测试过。


一、setf 函数举例

setf 函数为指定的取值函数定义一个伴随的赋值操作。以 car 为例。


  1. (setq x '(1 2 3 4)) => (1 2 3 4)

  2. (car x) => 1

  3. (setf (car x) 100) => 100

  4. x => (100 2 3 4 )
复制代码


(car x) 取值, (setf (car x) ...) 赋值。

二、自定义 setf 函数

car 的这个性质是默认的。如果自己实现一个函数,还会有这种性质吗?


  1. (defun mycar (l)
  2.     (car l))

  3. (setq x '(1 2 3 4)) =>

  4. (setf (mycar x) 100) => *** - FUNCTION: undefined function (SETF MYCAR)
复制代码


出错了,因为没有为 mycar 登记一个 setf 函数。现在来登记一个


  1. (defun (setf mycar) (value list)
  2.     (cons value (cdr list)))

  3. (setf (mycar x) 100) => (100 2 3 4)
复制代码


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 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-07-11 09:37 |只看该作者
原帖由 win_hate 于 2009-7-10 17:11 发表
我不用楼主的例子,因为那里的代码不全。

下面出现的代码在  clisp 上测试过。


一、setf 函数举例

setf 函数为指定的取值函数定义一个伴随的赋值操作。以 car 为例。


(setq x '(1 2 3 4)) => ( ...

谢谢老大
现在清楚多了,只是觉得这个语法怪怪的,还是因为受c的毒害太深阿
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP