gpt4 book ai didi

lisp - 在循环中使用 Setf 语法

转载 作者:太空宇宙 更新时间:2023-11-03 18:51:17 25 4
gpt4 key购买 nike

为下面的变量执行 setf 的正确方法是什么?

CG-USER(279): (defun LETTERSEARCH (string1 string2) 
(let ((newString nil))
(let ((letterSearchOn nil))
(loop for i from 0 below (length string1)
always
(setf (letterSearchOn (char string1 i))
(print letterSearchOn))))))
LETTERSEARCH
CG-USER(280): (stringprod "abc" "abc")

NIL
Error: `(SETF LETTERSEARCHON)' is not fbound
[condition type: UNDEFINED-FUNCTION]
CG-USER(281):

最佳答案

应该是 (setf letterSearchOn (char string1 i))

(setf) 在 Common Lisp 中的工作方式真的很酷;它是一个宏,但使用的宏扩展器取决于参数。例如:

(defparameter a (list 1))
(setf (car a) 2)
a ; => (2)
(setf (cdr a) (list 3))
a ; => (2 3)

这看起来很奇怪吗? (car a) 是一个函数……你怎么能把它“设置”为一个新值???答案是,如果 (setf) 的第一个参数是以 car 开头的列表,它会扩展为设置 car 的代码缺点细胞。如果第一个参数是以 cdr 开头的列表,它会扩展为设置 cons 单元格的 cdr 的代码。依此类推向量、哈希表等。

您甚至可以定义自己的(setf) 宏,这可以扩展(setf) 知道如何设置的范围。在这种情况下,您传递的是 (letterSearchOn (char string1 i)),因此它认为您希望它使用特殊的 letterSearchOn 宏扩展器,但没有这样的 setf 宏扩展器已定义。

关于lisp - 在循环中使用 Setf 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9261351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com