common-lisp - setf函数和函数的区别

标签 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 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 函数用作地方(又名。广义引用)。这意味着它可以与修改宏一起使用,例如 INCFROTATEF。不过,您还必须为它们编写相应的 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 或修改宏的风格选择。

关于common-lisp - setf函数和函数的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48541489/

相关文章:

lisp - 取出列表中除最后一次出现的结构之外的所有结构

emacs - 如何退出 SLIME - 逗号或退出不起作用

ide - 有没有办法在服务器上运行 Lisp-in-box?

loops - Antik Iter 未知关键字矩阵元素

cocoa - 使用 Mac 端口 Clozure Common Lisp 无法执行 `(require "COCOA")`

common-lisp - LISP 中两个位向量之间的距离

exception - Common Lisp 错误处理系统中 'store-value' 和 'use-value' 重新启动的语义

lisp - 在 LISP 中使用 dolist 反转列表

Lisp 函数 : union

common-lisp - 用于连接字符串列表的 lisp 函数