【发布时间】:2014-04-03 11:10:36
【问题描述】:
我想保存一个引用(指针)到我保存在另一个变量中的一些数据的一部分:
(let ((a (list 1 2 3)))
(let ((b (car (cdr a)))) ;here I want to set b to 2, but it is set to a copy of 2
(setf b 4))
a) ;evaluates to (1 2 3) instead of (1 4 2)
我可以使用宏,但是如果我想更改列表中间的一些数据并且我不是很灵活,那么将有很多代码要执行:
(defparameter *list* (create-some-list-of-arrays))
(macrolet ((a () '(nth 1000 *list*)))
(macrolet ((b () `(aref 100 ,(a))))
;; I would like to change the macro a here if it were possible
;; but then b would mean something different
(setf (b) "Hello")))
是否可以创建一个变量作为引用而不是副本?
【问题讨论】:
-
(let ((a (list 1 2 3))) (setf (second a) 4) a) 有什么问题?
-
我强烈推荐阅读gigamonkeys.com/book/variables.html 并关注值、变量和位置的细节。抱歉,如果您不是该语言的新手,但如果您是该语言的新手,请记住,其他语言的映射技术不一定会给您提供好的或快速的代码。
-
您可能会对How do I globally change a variable value within function in lisp 的答案感兴趣,该答案讨论了 C 指针、通过结构(包括 cons 单元格)的间接寻址、通用引用和模拟 C 样式指针。问题并不完全相同,但我认为答案可能就是您所需要的。
-
第一个代码 sn-p 有未定义的行为。使用引号定义的列表是常量,修改常量的效果是未定义的。如果要修改列表,请使用列表创建它
标签: pointers lisp common-lisp