首页 > 解决方案 > 如何从 lisp 的嵌套列表中删除长度为 1 的列表?

问题描述

我有一个嵌套列表 (1 (4 (5) 3) 9 10),我想删除长度为 1 的列表,因此结果将是 (1 (4 3) 9 10)。这是我迄今为止尝试过的,它不会删除 (5) 并返回原始列表。

(defun remove (l)
(cond
    ((null l) nil)   
    ((and (listp (car l)) (= (length l) 1)) (remove (cdr l)))   
    ((atom (car l)) (cons (car l) (remove (cdr l))))
    (T (cons (remove (car l)) (remove (cdr l))))   
))

标签: recursionlispcommon-lispnested-lists

解决方案


两件事:首先,remove是包 CL 中的预定义函数,所以我强烈建议使用不同的名称,比如说my-remove. 其次,您正在测试长度l而不是 sublist (car l),这是您想要消除的。正确的形式是:

(defun my-remove (l)
  (cond
    ((null l) nil)   
    ((and (listp (car l)) (= (length (car l)) 1)) (my-remove (cdr l)))   
    ((atom (car l)) (cons (car l) (my-remove (cdr l))))
    (T (cons (my-remove (car l)) (my-remove (cdr l))))   
))

推荐阅读