Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 试图在Dr.Racket中实现remove*?_Scheme_Lisp_Racket - Fatal编程技术网

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
    会删除一个元素的所有匹配项,而不是只删除第一个匹配项,所以我更改了答案