Lisp 可变变量的追加

Lisp 可变变量的追加,lisp,common-lisp,Lisp,Common Lisp,是否有内置函数或宏将列表附加到可变列表中。有点像推,但有点不同 以下是使用Exaple的推送: (setq v '(3)) (push '(1 2) v) ;v now ((1 2) 3) 我需要休闲的行为: (setq v '(3)) (mappend '(1 2) v) ;v should be (1 2 3) 我想你在找什么 [功能]NCOC和rest列表 NCOC将列表作为参数。它返回一个列表,该列表是 参数连接在一起。参数已更改,而不是更改 抄袭的。将其与append进行比较,ap

是否有内置函数或宏将列表附加到可变列表中。有点像推,但有点不同

以下是使用Exaple的推送:

(setq v '(3))
(push '(1 2) v) ;v now ((1 2) 3)
我需要休闲的行为:

(setq v '(3))
(mappend '(1 2) v) ;v should be (1 2 3)

我想你在找什么

[功能]NCOC和rest列表

NCOC将列表作为参数。它返回一个列表,该列表是 参数连接在一起。参数已更改,而不是更改 抄袭的。将其与append进行比较,append复制参数而不是 摧毁他们。例如:

setq x'a b c setq y'd e f nconc x y=>a b c d e f x =>a b c d e f

您可以使用nconc定义一个pushlist宏,使其具有类似于push的界面:

(defmacro pushlist (lst place)
  `(setf ,place (nconc ,lst ,place)))
并测试它:

CL-USER> 
(defparameter *v* (list 3))
*V*
(pushlist (list 1 2) *v*)
CL-USER> 
(1 2 3)
CL-USER>
*v*
(1 2 3)
CL-USER> 

还要注意的是,在阅读了sigjuice的评论之后,我使用的是列表3,而不是'3'。

我想你在找什么

[功能]NCOC和rest列表

NCOC将列表作为参数。它返回一个列表,该列表是 参数连接在一起。参数已更改,而不是更改 抄袭的。将其与append进行比较,append复制参数而不是 摧毁他们。例如:

setq x'a b c setq y'd e f nconc x y=>a b c d e f x =>a b c d e f

您可以使用nconc定义一个pushlist宏,使其具有类似于push的界面:

(defmacro pushlist (lst place)
  `(setf ,place (nconc ,lst ,place)))
并测试它:

CL-USER> 
(defparameter *v* (list 3))
*V*
(pushlist (list 1 2) *v*)
CL-USER> 
(1 2 3)
CL-USER>
*v*
(1 2 3)
CL-USER> 

还请注意,在阅读sigjuice的评论后,我使用的是列表3,而不是“3”。

标题谈到了“可变变量”,关于“可变列表”的问题?这是怎么一回事?仅仅使用APPEND?'3和'12不应该被认为是可变的,这有什么错呢。有关更多信息,请参阅。标题涉及“可变变量”,关于“可变列表”的问题?这是怎么一回事?仅仅使用APPEND?'3和'12不应该被认为是可变的,这有什么错呢。有关更多信息,请参阅。请注意,定义的pushlist宏可以就地计算表达式两次;使用定义修改宏等可避免此问题。正确。我认为这只是一个性能上的打击,假设人们期望place在重复呼叫时评估相同的东西。另外,如果place不是一个cons(对我来说几乎是所有用例),那么就不需要define-modify宏。所以我选择了简单而不是效率。虽然我会在你的评论后阅读定义修改宏;还有更多内容需要我去学习。在Lisp上有一个例子说明了为什么这不是一个好的假设。我很确定这不是一个唯一的场景让计数器0列表列表列表列表列表'a'b列表'c'd列表'e'f pushlist列表'g'h nth incf计数器列表列表列表列表列表列表列表列表列表列表列表列表列表列表中定义的pushlist宏可以计算表达式的节点放置两次;使用定义修改宏等可避免此问题。正确。我认为这只是一个性能上的打击,假设人们期望place在重复呼叫时评估相同的东西。另外,如果place不是一个cons(对我来说几乎是所有用例),那么就不需要define-modify宏。所以我选择了简单而不是效率。虽然我会在你的评论后阅读定义修改宏;这里还有更多我需要学习的内容。在Lisp上有一个例子说明了为什么这不是一个好的假设。我很确定这不是一个唯一的场景让计数器0列表列表列表列表'a'b列表'c'd列表'e'f推列表'g'h N增量计数器列表列表列表列表列表