Scheme 我有这个代码来删除列表的最后一个元素。如何更改此设置以删除集合词,而不考虑其位置?

Scheme 我有这个代码来删除列表的最后一个元素。如何更改此设置以删除集合词,而不考虑其位置?,scheme,racket,Scheme,Racket,然后打印出: (帮助我) 我怎样才能改变这个?例如,如果我想删除me 像这样,例如: #lang racket (define (remove-last lst) (if (null? (cdr lst)) '() (cons (car lst) (remove-last (cdr lst))))) (remove-last '(Help Me Please)) 然后 也可以对集合使用以下步骤: > (remove-words '(Help Me

然后打印出:

(帮助我)


我怎样才能改变这个?例如,如果我想删除
me

像这样,例如:

#lang racket
(define (remove-last lst)
    (if (null? (cdr lst))
        '()
        (cons (car lst) (remove-last (cdr lst)))))

(remove-last '(Help Me Please))
然后

也可以对集合使用以下步骤:

> (remove-words '(Help Me Please) '(Me Help Not))
'(Please)

请注意,您在这里使用的是符号,而不是字符串。

您也可以使用和
成员一起解决问题:

(define (remove-words lst words)
  (set-subtract lst words))
如果你想减少匿名函数的冗长,最适合的工具是and(后者需要
(需要srfi/26)

对一个函数进行curry运算会将其转换为一个新函数,该函数接受一个参数,然后返回另一个函数,该函数接受一个参数,然后再返回一次,再返回一次,依此类推,直到它拥有调用原始函数所需的所有参数。
删除单词的咖喱版本将被称为
((删除单词lst)words)
,您可以使用
(咖喱删除单词)
从我们当前的实现中实现它。这要求以从左到右的顺序提供参数,这不适用于
成员
。还有另一种形式是从右向左的
curryr
,但是因为
member
接受可选的第三个参数,所以它不起作用

然后,您可以使用(来自srfi 26),它允许您选择要“锁定”的函数的哪些参数,以及希望新函数接受的参数
(剪切成员词)
创建一个新函数
(lambda(arg)(成员arg词))
(剪切*8)
创建
(lambda(arg1 arg2)(*arg1 arg2 8))
。因此,
删除单词
如下所示:

(define (remove-words lst words)
  (filter-not (lambda (x) (member x words) lst))
(需要srfi/26)
(定义(删除单词lst单词)
(不过滤(剪切成员词)lst)

尽管使用
set subtract
可能仍然是最好的解决方案,因为您应该尽可能避免重新发明轮子(除非您试图了解更多有关轮子的信息)。尽管如此,牢牢掌握球拍提供的一般功能是非常有用的,它可以让你的生活更轻松。

太好了!用户是否有办法键入要删除的单词?例如,在我的java等价物中,我使用了以下内容:String[]RemoveWords=newstring[]{“times”、“age”、“epoch”、“the”、“it”};允许用户选择从字符串中删除哪些单词。亲爱的down投票者,请随时公开分享您对我的答案的批评。我不关心要点,但我关心反馈和见解。这个问题似乎离题了,因为它不是一个真正的问题——看起来像是HomeWork,我现在有了上一个版本的代码help@NormanGray家庭作业不被认为是离题的,所以。@uselpa确实如此(cf)。但这是离题的,因为它太模糊,缺乏研究证据(其根本原因可能是因为它可能是家庭作业,但离题性使它赢得了密切的投票)。
(define (remove-words lst words)
  (filter-not (lambda (x) (member x words) lst))
(require srfi/26)
(define (remove-words lst words)
  (filter-not (cut member <> words) lst))