-3

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

(defun do-transf (lst)

...

我最初的 lst 是 ((NIL NIL) (NIL NIL)) 但最后我希望 lst 变成

(无 无 无 无)

例子

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

(do-transf a)

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

一个

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

4

3 回答 3

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)
于 2013-11-08T01:00:04.497 回答
1

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

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

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

如果我们看下面的代码:

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

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

于 2013-11-08T23:30:59.353 回答
0

尝试使用扁平化..

(defvar a (flatten (list (list NIL NIL) (list NIL NIL))))
于 2013-11-08T01:06:10.107 回答