LISP修改列表作为参数传递

LISP修改列表作为参数传递,lisp,common-lisp,Lisp,Common Lisp,所以我得到了这个函数,它接收一个列表作为参数 (defun do-transf (lst) 我的初始lst是零零零零零 但最终我希望lst变成 零零零零零 范例 定义一个列表NIL NIL list NIL NIL 做一个 NIL NIL NIL->给出了正确的答案,但当我调用列表时,这不是答案 a NIL NIL NIL NIL->我不想要这个你的帖子建议你做列表连接,也就是把列表附加到另一个列表上 因此,请尝试以下方法: (defvar a (list (list NIL NIL) (l

所以我得到了这个函数,它接收一个列表作为参数

(defun do-transf (lst)

我的初始lst是零零零零零 但最终我希望lst变成

零零零零零

范例

定义一个列表NIL NIL list NIL NIL

做一个

NIL NIL NIL->给出了正确的答案,但当我调用列表时,这不是答案

a


NIL NIL NIL NIL->我不想要这个

你的帖子建议你做列表连接,也就是把列表附加到另一个列表上

因此,请尝试以下方法:

(defvar a (list (list NIL NIL) (list NIL NIL)))
(apply #'append a)
这将产生:

(NIL NIL NIL NIL)
简短、简单、甜蜜

更新:

因为您想要破坏性行为,即修改原始值:

现在,a从NIL NIL NIL设置为这个新值:

尝试使用“展平”

(defvar a (flatten (list (list NIL NIL) (list NIL NIL))))

通常,lisp函数不会改变它们所操作的数据。这不是必需的属性,但它确实使编写和推理大型代码库变得更加容易

因此,通常情况下,函数将返回新数据的副本,然后由调用方自行决定替换变量中的旧值

即使函数以破坏性方式修改数据结构,它们也倾向于返回新的结果值

如果我们查看以下代码:

(defvar *example* '(delete 2 3 4))
=> *example*
(delete 'delete *example*)
=> (2 3 4)
*example*
=> (delete 2 3 4)

这是因为函数无法破坏性地修改*example*,因此它会丢失第一个元素,因此即使使用破坏性的、变异的函数,它们也需要返回一个适合存储回输入来源的变量的值

@user2967111:你想要破坏性的行为?也就是说,您希望修改?@user2967111:该行为是正确的。很少有LISP函数需要您修改某些内容的值。LISP的工作方式是对输入的数据进行操作,然后返回修改后的数据。defun bla lst setq lst apply“追加一个defvar列表NIL NIL list NIL bla a NIL NIL NIL NIL NIL a NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL列表保持不变..很抱歉,我无法回答我的问题yet@user2967111字体你刚才写的东西有很多问题。很多请不要误解这一点,但我认为您应该寻找一个好的LISP源代码,以便在学习的同时更好地理解该语言。祝你一切顺利。这不是重点,我知道如何从零零零零零零零到零零零零零我想要的是列表变成我理解你希望从对其中一个答案的评论来看这是破坏性的,但具体如何?在第一种情况下,一个由两个元素组成的列表,每个元素都等于nil nil,但现在我们称它们为x和y。所以a是x。Ynil,即由两个cons单元格组成的列表,我们称它们为xc和yc。您想要的结果是n1。n2。n3。n4。nil n代表nil,它是由四个cons单元格组成的列表。xc和yc可以重复使用,但其他两个将从何而来?
(defvar a (flatten (list (list NIL NIL) (list NIL NIL))))
(defvar *example* '(delete 2 3 4))
=> *example*
(delete 'delete *example*)
=> (2 3 4)
*example*
=> (delete 2 3 4)