我有一个清单
'((1 2 (A B C)) (2 3 (B C D)) (4 5 (C D F)))
我想处理内部列表中的元素(在这种情况下,我想将(A B C)
其他列表更改为(M M M)
)。
我编写了代码(process lst)
,它将对内部列表执行此任务。
(defun process (lst)
(cond
((null lst) '())
(T (cons 'M (process (cdr last))))))
当我从main函数调用时
(defun iterate-list (lst)
(cond
((null lst) '())
((listp (car lst))
(cons (process (car lst))
(iterate-list (cdr lst))))
(T
(cons (car lst)
(iterate-list (cdr lst))))))
我得到((M M M) (M M M) (M M M))
代替((1 2 (M M M)) (2 3 (M M M)) (4 5 (M M M)))
。
但是当我(cons (car lst)) (iterate-list (cdr lst)))
在第二种情况下使用相同的功能时(listp (car lst))
,我得到了正确的答案,那就是
'((1 2 (A B C)) (2 3 (B C D)) (4 5 (C D F)))
我不知道我在哪里犯错。
注意 您需要重命名last
为lst
in process
。
我正在获取[[MMM)(MMM)(MMM))而不是[[1 2(MMM))(2 3(MMM))(4 5(MMM))))。
该代码可以工作,但不能达到您想要的深度:
(process '(a b c d))
=> (M M M M)
(iterate-list '(1 2 (A B C)))
=> (1 2 (M M M))
为了处理根列表中的所有列表,可以执行以下操作:
(mapcar #'iterate-list '((1 2 (A B C))
(2 3 (B C D))
(4 5 (C D F))))
=> ((1 2 (M M M)) (2 3 (M M M)) (4 5 (M M M)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句