方案 - 有没有办法将表达式设置为 remf* 功能中的 pred?

Scheme - Is there a way to set an expression as the pred in the remf* functionality?

作为作业的一部分,我需要创建自己版本的 Scheme 的过滤功能。我的代码能够根据特定条件选择要打印的值,但对于不能打印的值,取而代之的是 #<void>。我一直在查看 Scheme 文档,我认为放弃这些值的最佳选择是使用 remf* 但我希望能够在 pred 字段中输入特定表达式。我使用的解释器一直给我错误,所以我想知道是否可以使用 remf* 来实现我想要实现的目标,或者我是否应该查看另一个函数

到目前为止我自己的过滤函数及其return:

(define (sort max lst)
    (map (λ (x) (cond[(> x max) x])) lst))

'(#<void> #<void> 6 7)

我的单独测试代码remf*

(remf* (= car 2) '(1 2 3 4))

我是Scheme的新手,所以如果有更好的功能我可以使用请告诉我,我会查找它的文档。

您绝对不想使用 remf*。或者,就此而言,map。而是想想过滤列表是什么意思,大致就是这样。

使用谓词过滤列表:

  1. 如果列表为空,则结果为空列表;
  2. 否则列表有第一个元素和一些其他元素 –
    1. 如果第一个元素的谓词为真,则结果是一个列表,该列表是过滤其他元素的结果中的第一个元素(您是否有方便的函数来做到这一点?还没有,也许),
    2. 否则为其他元素过滤后的结果;
  3. ...利润。

The interpreter I am using keeps giving me errors

以后有问题,请补充相关错误,帮助调试。

(remf* (= car 2) '(1 2 3 4))

谓词应该是一个过程,但是你这里直接给出了一个表达式。您应该构建一个函数,就像您在 map 示例中所做的那样:

(remf* (lambda (v) (= v 2))
       '(1 2 3 4))

不要使用 map,它总是 returns 与输入列表大小相同的列表,您可以尝试使用 fold-right,它 折叠 一个列表变成一个聚合值(变形)。它接受一个基值,这里是空列表 '() 下方,还有一个过程接受列表中的当前 value 和当前聚合结果,这里是 result-list.

这里,当value等于2时,原样返回给定的result-list。 否则,将当前值添加到 result-list 前面以构建新的聚合值。因此,下面的示例从列表中删除了 2。

(fold-right (lambda (value result-list) 
               (if (= value 2) 
                   result-list
                   (cons value result-list)))
            '() 
            '(1 2 3 4 4 2))
=> (4 4 3 1)

为了构建您自己的 filter 函数,您可以接受函数 f 作为谓词,而不是将 value 与2,你会调用(f value)看元素是否应该保留。