setf function的问题,谢谢

发布于 2022-08-24 06:46:44 字数 820 浏览 17 评论 2

还是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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

老子叫无熙 2022-08-26 11:23:37

原帖由 win_hate 于 2009-7-10 17:11 发表
我不用楼主的例子,因为那里的代码不全。

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

一、setf 函数举例

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

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

谢谢老大
现在清楚多了,只是觉得这个语法怪怪的,还是因为受c的毒害太深阿

无可置疑 2022-08-24 15:50:07

我不用楼主的例子,因为那里的代码不全。

下面出现的代码在  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 编辑 ]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文