LISP修改列表作为参数传递

时间:2013-11-08 00:31:40

标签: lisp common-lisp

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

(defun do-transf (lst)

...

我的第一个是((NIL NIL)(NIL NIL)) 但最后我希望lst成为

(NIL NIL NIL NIL)

示例

  

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

     

(do-transf a)

(NIL NIL NIL NIL) - >给出了正确的答案,但是当我打电话给列表时,这不是答案

  

a

<(>(NIL NIL)(NIL NIL)) - &gt;我不想要这个

3 个答案:

答案 0 :(得分:2)

您的帖子表明您希望执行列表连接,即将列表附加到另一个列表。

因此,试试这个:

(defvar a (list (list NIL NIL) (list NIL NIL)))
(apply #'append a)

输出:

(NIL NIL NIL NIL)

简短,简单,甜蜜。

更新:

由于您需要破坏性行为(即修改a的原始值):

(setq a (apply #'append a))

现在,a设置为此新值(来自((NIL NIL) (NIL NIL))):

(NIL NIL NIL NIL)

答案 1 :(得分:1)

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

因此,通常情况下,函数将返回新数据的副本,然后可以根据调用者的判断替换变量中的旧值。

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

如果我们查看以下代码:

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

这是因为函数有 no 方式破坏性地修改*example*所以它丢失了第一个元素,所以即使你使用破坏性的,变异的函数,它们也需要返回适合存储回输入来自的变量的值。

答案 2 :(得分:0)

尝试使用展平..

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