2012-07-12 21 views
11

Oto, co następuje: nie "dostaje" setf-expanderów i chciałbym się dowiedzieć, jak działają.Definiowanie setf-expanderów w Common Lisp

muszę się nauczyć, jak one działają, bo mam problem, który wydaje się być typowym przykładem dla których warto uczyć się setf-ekspandery, problem jest następujący:

(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) 

Jak napisać odpowiedni ekspander dla ARR-INDEX?

Odpowiedz

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

W Common Lisp function name nie może być tylko symbol, ale także wykaz dwa symbole z SETF jako pierwszy symbol. Patrz wyżej. DEFUN w ten sposób można zdefiniować funkcje SETF. Nazwa tej funkcji to (setf arr-index).

setf funkcja może być stosowany w miejscepostać: CLHS: Other compound forms as places.

Nowa wartość jest wtedy pierwszym argumentem.

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

Nie mogłem znaleźć tego w CLHS, gdzie to jest? –

+0

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

+0

Widziałem to w glosariuszu, ale gdzie jest wyjaśnione, jak zdefiniować funkcję setf z (defun (setf bla)...)? –

2

Odpowiedź Rainera jest na miejscu. Przed ANSI Common Lisp konieczne było użycie defsetf do zdefiniowania ekspandera dla prostych miejsc, które można ustawić za pomocą prostego wywołania funkcji. setf Funkcje takie jak (setf arr-index) pojawiły się w języku CLOS i upraszczają wiele rzeczy. W szczególności funkcje setf mogą być ogólne.