Common lisp setf函数和函数之间的区别

Common lisp setf函数和函数之间的区别,common-lisp,Common Lisp,以下解决方案(setf函数和函数)之间有什么区别?其中一种方法更可取,还是只有两种方法可以获得相同的结果 (defparameter *some-array* (make-array 10)) (defun (setf arr-index) (new-value index-string) (setf (aref *some-array* (parse-integer index-string)) new-value)) (defun arr-index-1 (index-string

以下解决方案(setf函数和函数)之间有什么区别?其中一种方法更可取,还是只有两种方法可以获得相同的结果

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

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

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

CL-USER> *some-array*
#(0 0 0 0 0 0 0 0 0 0)
CL-USER> (setf (arr-index "2") 7)
7
CL-USER> (arr-index-1 "3" 5)
5
CL-USER> *some-array*
#(0 0 7 5 0 0 0 0 0 0)

谢谢您的回答。

setf函数作为一个位置(又称广义参考)工作。这意味着它可以与修改宏一起使用,例如
INCF
ROTATEF
。不过,您还必须编写相应的getter函数才能让它们工作

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

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

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

CL-USER> (setf (arr-index "3") 10)
10
CL-USER> (incf (arr-index "3"))
11
CL-USER> (incf (arr-index "3"))
12
CL-USER> (rotatef (arr-index "3")
                  (arr-index "6"))
NIL
CL-USER> (incf (arr-index "3") 100)
100
CL-USER> *some-array*
#(0 0 0 100 0 0 12 0 0 0)
通常首选setf函数,除非您出于某种原因选择不使用setf或修改宏