我发现这个帖子的内容非常有用! 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)
希望这是有道理的。
答案 0 :(得分:1)
这是一个使用filter
和member
来完成此操作的简单函数:
(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”。只需几个小时的阅读时间,阅读后你将成为递归的主人。