Scheme 试图在Dr.Racket中实现remove*?
Scheme 试图在Dr.Racket中实现remove*?,scheme,lisp,racket,Scheme,Lisp,Racket,(移除所有(a b c d);(a c a)) 在这种情况下,预期输出为'(bd) 我可以使用remove,但不能使用remove*本身。目前我遇到了以下错误: 应用程序: 不是一个程序;应为可应用于参数的过程 给定:'(b c d) 参数…:如果您在DrRacket中执行程序,您将获得错误消息,并清楚地证明其原因: 您可以看到问题出在: (define (removeAll list-a list-b) (if (empty? list-b) list-a (apply
(移除所有(a b c d);(a c a))
在这种情况下,预期输出为'(bd)
我可以使用remove,但不能使用remove*本身。目前我遇到了以下错误:
应用程序:
不是一个程序;应为可应用于参数的过程
给定:'(b c d)
参数…:
如果您在DrRacket中执行程序,您将获得错误消息,并清楚地证明其原因:
您可以看到问题出在:
(define (removeAll list-a list-b)
(if (empty? list-b)
list-a
(apply
(removeAll((remove (first list-b) list-a) (rest list-b)))
)
)
)
原因是在scheme中,不能像在其他语言中一样自由地使用括号:(+2(+3 4))
不等于(+2(+3 4))
:第一个表达式计算为9,第二个表达式给出错误,因为(+3 4))
是这样解释的:
((remove (first list-b) list-a) (rest list-b)))
(+34)
,即对参数3和4应用操作+
,生成7(+3 4)
位于另一组括号内,因此请获取结果并尝试将(7)
作为一个表单进行计算。但是7
不是运算符(“不是过程”,如错误消息所述),因此会引发错误remove
的结果是一个列表,不能用作运算符
如果删除双括号,请按以下方式:
((remove (first list-b) list-a) (rest list-b)))
您将删除第一个错误,您将看到还有另一个错误,特别是:
(removeAll (remove (first list-b) list-a) (rest list-b))
以下是一个可能的解决方案:
apply: arity mismatch;
the expected number of arguments does not match the given number
expected: at least 2
given: 1
arguments.:
函数
filter
删除所有不满足谓词的元素 换一种说法,;在scheme或racket中的表达式周围添加paren就像在其他语言中的表达式后面放置一对空表达式。所以如果(ab)像a(b),那么((ab))像a(b)()。这可能是合法的Java表达式。。。但仅当a(b)返回一个没有参数的函数时。@JohnClements谢谢!非常接近,但是我得到的是”(b b c d)
而不是(b b d)
@您好,我犯了一个错误,认为remove
会删除一个元素的所有匹配项,而不是只删除第一个匹配项,所以我更改了答案