2015-12-14 67 views
-2

我想写一个函数,该函数从列表的任何 级别删除所有出现的原子。我的代码:lisp从列表中删除所有出现的信息

(defun sterge (e l) 
    (cond 
    ((and (atom l) (equal e l)) nil) 
    ((atom l) (list l)) 
    (t (list (mapcan '(lambda (l) (sterge e l)) l))))) 

(defun sterg (e l) 
    (car (sterge e l))) 

当我执行它给了我:

(sterg '(1 2 (1 3)) 1) 
1 

我把任何价值,它给了我1,什么是错的?

+0

许多事情在这里说,但只是基础知识 - 你是不是用反向参数调用这个函数? 'e'是元素,'l'是列表,对吗? – uselpa

+0

然后你只需要在'(lambda ...)'前面删除引号就可以了。 – uselpa

+0

它的工作得益于您的意见,但@uselpa,为什么它删除报价后工作? – Nero

回答

1

如果(remove-all '((1 2 3) (3 1 2 (4 3) 5 3)) 3)评估为'((1 2) (1 2 (4) 5)),那么下面的工作(方案):

(define (remove-all lst elt) 
    (if (null? lst) '() 
     (if (equal? (car lst) elt) 
      (remove-all (cdr lst) elt) 
      (cons (if (pair? (car lst)) 
        (remove-all (car lst) elt) 
        (car lst)) 
       (remove-all (cdr lst) elt))))) 

相反,如果(remove-all '((1 2 3) (3 1 2 (4 3) 5 3)) 3)评估为'((1 2 #f) (#f 1 2 (4 #f) 5 #f))再考虑:

(define (deep-map fn lst) 
    (if (null? lst) '() 
     (cons (if (pair? (car lst)) 
       (deep-map fn (car lst)) 
       (if (null? (car lst)) '() 
        (fn (car lst)))) 
       (deep-map fn (cdr lst))))) 

(define (remove-all lst elt) 
    (deep-map (lambda (e) (if (equal? e elt) #f e)) lst))