Scheme删除列表

时间:2011-12-02 16:55:24

标签: list filter scheme

我发现这个帖子的内容非常有用! How to delete an element from a list in scheme

我测试了推荐的代码,似乎它删除了第一个且仅在列表中出现的单个项目。

相反,我想要从列表中出现所有项目。或者更进一步,如果我想指定一个项目列表而不是要删除的项目。

例如,如果我有一个名为removelist的函数,它将两个列表作为参数

(define (removelist L M))

> (removelist '(1 2 2 3 4 5 2 2 5 6 7 8 9) '(1 2))
> '(3 4 5 5 6 7 8 9)

希望这是有道理的。

2 个答案:

答案 0 :(得分:1)

这是一个使用filtermember来完成此操作的简单函数:

(define (remove-list l m)
 (filter (lambda (element)
          (not (member element m)))
  l))

结果如下:

> (remove-list '(1 2 2 3 4 5 2 2 5 6 7 8 9) '(1 2))
  (3 4 5 5 6 7 8 9)
> (remove-list '(1 2 2 3 4 5 2 2 5 6 7 8 9) '(1 2 1))
  (3 4 5 5 6 7 8 9)

此代码段需要srfi-1。希望这会有所帮助。

的问候,
马特

答案 1 :(得分:0)

使用简单的递归,没有像filter或member这样的内置函数:

(define (filter_out m l)
  (cond ( (null? l) '() )
        ( (equal? (car l) m) (filter_out m (cdr l)) )
        ( else (cons (car l)  (filter_out m (cdr l))) )
        ))

测试:

(filter_out 'jay (list 'jay 'z 'jay 'dilla 'jay 'electro))
(filter_out '(jay z) (list '(jay z) '(jay dilla) 'jay '(electro)))

如果您对学习此类编码感兴趣,请查看“The Little Schemer”。只需几个小时的阅读时间,阅读后你将成为递归的主人。