2012-07-12 77 views
11

下面是这个问题:我不“获得”setf-expanders,并想了解它们是如何工作的。在Common Lisp中定义setf-expanders

我需要了解他们是如何工作的,因为我有这似乎是为什么你应该学会SETF扩张器的典型实例的问题,问题如下:

(defparameter some-array (make-array 10)) 

(defun arr-index (index-string) 
    (aref some-array (parse-integer index-string)) 

(setf (arr-index "2") 7) ;; Error: undefined function (setf arr-index) 

我怎样写一个适用于ARR-INDEX的setf-expander?

回答

15
(defun (setf arr-index) (new-value index-string) 
    (setf (aref some-array (parse-integer index-string)) 
     new-value)) 

用Common Lisp function name不仅是一个象征,也是两个符号与SETF因为第一个符号列表。往上看。 DEFUN因此可以定义SETF函数。该函数的名称是(setf arr-index)

SETF功能可以在地方形式使用:CLHS: Other compound forms as places

然后新值是第一个参数。

CL-USER 15 > some-array 
#(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL) 

CL-USER 16 > (setf (arr-index "2") 7) 
7 

CL-USER 17 > some-array 
#(NIL NIL 7 NIL NIL NIL NIL NIL NIL NIL) 
+0

我在CLHS找不到这个,在哪里? – 2015-12-10 11:07:45

+0

@Nowhereman:http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_f.htm#function_name – 2015-12-10 11:34:38

+0

我在词汇表中看到过它,但是它在哪里解释了如何使用defun(setf富)......)? – 2015-12-10 19:17:58

2

Rainer的答案是现货。在ANSI Common Lisp之前,有必要使用defsetf来为简单的地方定义一个扩展器,这些地方可以通过简单的函数调用来设置。 setf(setf arr-index)这样的功能用CLOS进入了语言并简化了很多东西。特别是,setf函数可以是通用的。