2012-07-12 75 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函數可以是通用的。