所以我得到了一个接收列表作为参数的函数
(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)
- >给出了正确的答案,但是当我打电话给列表时,这不是答案
<(>(NIL NIL)(NIL NIL)) - &gt;我不想要这个a
答案 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))))