2012-07-12 10 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? Common Lispでは

答えて

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

function nameできるだけでなくシンボルであるだけでなく、最初のシンボルとしてSETFを有する2つのシンボルのリスト。上記を参照。したがって、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ではこれを見つけることができませんでしたが、それはどこですか? –

+0

@Nowhereman:http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_f.htm#function_name –

+0

私は用語集でそれを見ていましたが、setf関数を定義する方法はどこで(defun(setf foo)...)? –

2

Rainer's answer on spotです。 ANSI Common Lispの前には、簡単な関数呼び出しで設定できる単純な場所のエクスパンダを定義するのに、defsetfを使う必要がありました。 setfのような機能は、(setf arr-index)のようにCLOSを使用していたため、多くのことが簡単になりました。特に、setf関数は汎用である可能性があります。

関連する問題