多次删除列表中的特定元素不区分大小写

时间:2014-12-04 16:57:05

标签: lisp common-lisp

我一直在编写这段代码并研究递归运行函数的方法,并让它返回一个带有""消除。

我是Common Lisp的新手,我已经了解了基本功能,例如setq, cons, cond, equal, carcdr

当我浏览代码时,我不断获取列表中的最后一个元素,如果后面有the,则会跟随。

谁能告诉我我做错了什么并引导我朝着正确的方向前进?

允许的Common Lisp构造包括:CONDEQUAL(或EQUALP),CONSCARCDR,以及一些Common Lisp的基本原始构建块。

我无法使用任何预定义的函数来进行实际消除。

它应该是这样的...... 样品运行:

(filter-out-the   '(There are the boy and THE girl and The Rose))

返回:

(THERE ARE BOY AND GIRL AND ROSE)

这是我的代码:

(defun list_member (x L)
  (cond ((null L) nil)                      
        ((equal x (car L))                 
         (list_member x (cdr L)))           
        (T (cons (car l) (list_member x (cdr L))))))  


(defun filter-out-the (L)
  (setq x '(the))
  (cond ((null L) nil)                             
        ((list_member (car x) (cdr L )) (filter-out-the (cdr L))) 
        (T (cons (car L) (filter-out-the (cdr L))))))

1 个答案:

答案 0 :(得分:5)

该功能只是您的第一个功能,具有更好的命名:

(defun my-remove (item list)
  (cond ((null list) nil)                      
        ((equal item (first list))                 
         (my-remove item (rest list)))           
        (T (cons (first list)
                 (my-remove item (rest list))))))  

你可以称之为:

CL-USER 36 > (my-remove 'the '(there are the boy and the girl and the rose))
(THERE ARE BOY AND GIRL AND ROSE)