#lang racket
(define (remove-last lst)
(if (null? (cdr lst))
'()
(cons (car lst) (remove-last (cdr lst)))))
(remove-last '(Help Me Please))
然后打印出来:
(Help Me)
我该怎么改变?例如,如果我想删除me
。
答案 0 :(得分:1)
像这样,例如:
(define (remove-words lst words)
(cond
((null? lst)
'())
((member (car lst) words)
(remove-words (cdr lst) words))
(else
(cons (car lst) (remove-words (cdr lst) words)))))
然后
> (remove-words '(Help Me Please) '(Me Help Not))
'(Please)
您还可以使用集合的过程:
(define (remove-words lst words)
(set-subtract lst words))
请注意,您在此处使用符号,而不是字符串。
答案 1 :(得分:1)
您也可以同时使用filter-not
和member
来解决问题:
(define (remove-words lst words)
(filter-not (lambda (x) (member x words) lst))
如果你想减少匿名函数的冗长,最适合的工具是curry
和cut
(后者需要使用(require srfi/26)
)。
使用函数将其转换为接受一个参数的新函数,然后返回另一个接受一个参数的函数,然后再次接受,然后再次,依此类推,直到它具有调用原始函数所需的所有参数。 remove-words
的curried版本将被称为((remove-words lst) words)
,您可以使用(curry remove-words)
从我们当前的实现中获取它。这要求以从左到右的顺序提供参数,这对member
不起作用。还有另一种形式curryr
从右到左,但因为member
采用可选的第三个参数,它将无效。
您可以使用cut
(来自srfi 26),这样您就可以选择要锁定的函数的哪些参数以及您希望新函数接受哪些参数。 (cut member <> words)
创建新功能(lambda (arg) (member arg words))
,(cut * <> <> 8)
创建(lambda (arg1 arg2) (* arg1 arg2 8))
。因此,remove-words
看起来像是:
(require srfi/26)
(define (remove-words lst words)
(filter-not (cut member <> words) lst))
虽然使用set-subtract
仍然可能是最好的解决方案,因为你应该尽可能避免重新发明轮子(除非你试图更多地了解轮子)。尽管如此,掌握Racket提供的一般功能非常有用,可以让您的生活更轻松。