方案 - 有没有办法将表达式设置为 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
。而是想想过滤列表是什么意思,大致就是这样。
使用谓词过滤列表:
- 如果列表为空,则结果为空列表;
- 否则列表有第一个元素和一些其他元素 –
- 如果第一个元素的谓词为真,则结果是一个列表,该列表是过滤其他元素的结果中的第一个元素(您是否有方便的函数来做到这一点?还没有,也许),
- 否则为其他元素过滤后的结果;
- ...利润。
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)
看元素是否应该保留。
作为作业的一部分,我需要创建自己版本的 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
。而是想想过滤列表是什么意思,大致就是这样。
使用谓词过滤列表:
- 如果列表为空,则结果为空列表;
- 否则列表有第一个元素和一些其他元素 –
- 如果第一个元素的谓词为真,则结果是一个列表,该列表是过滤其他元素的结果中的第一个元素(您是否有方便的函数来做到这一点?还没有,也许),
- 否则为其他元素过滤后的结果;
- ...利润。
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)
看元素是否应该保留。