如何在Common Lisp中调用此函数?

时间:2012-05-25 03:29:51

标签: common-lisp

(defun (setf xwin-border-width) (width win)
    (setf (xlib:drawable-border-width win) width))
那么如何调用上面的函数呢?事实上,我真的不明白“(setf xwin-border-width)”代替功能时间是什么意思?

此致!

2 个答案:

答案 0 :(得分:5)

这定义了setf函数。您可以使用(setf (xwin-border-width *some-window*) width)调用它。

您可能会发现setf的文档很有用:http://www.lispworks.com/documentation/lw50/CLHS/Body/m_setf_.htm

Hyperspec还有一个关于通用引用的部分:http://www.lispworks.com/documentation/lw50/CLHS/Body/05_a.htm

答案 1 :(得分:1)

通过制作第一个参数来解析这个形式(setf f),你可以定义当setf的第一个参数是对f的调用时会发生什么。

(defun foo (lst) (car lst))

(defun (setf foo) (val lst)
  (setf (car lst) val))

上面的一对函数将foo定义为car的同义词。在名称格式为(setf f)的函数的定义中,第一个参数表示新值,其余参数表示f的参数。

现在任何setffoo都会调用上面的后一个函数:

? (let ((z (list 1 2 3)))
     (setf (foo z) 168)
     z)
(168 2 3)

不必定义foo来定义`(setf foo),但它们通常成对出现。

检查Paul Graham的第6章ANSI Common Lisp的功能。