球拍错误:预期可以应用于参数的过程

时间:2018-07-12 05:59:13

标签: racket dr.racket

对不起,我刚开始使用球拍。我对此很陌生。我已经编写了这段代码:

(define (save_sheets lst num)
  (if(= num (- (length lst) 1))
     ('())
     (
      (my_save_image (join_sheet (list-ref lst num)) num)
      (save_sheets lst (+ num 1)))))

当然,当我运行此命令时,会出现以下错误:

application: not a procedure;
expected a procedure that can be applied to arguments
given: (object:image% ...)
arguments...: [none]

(join_sheet (list-ref lst num))应该返回错误显示的图像,但是my_save_image应该正确吗?它的参数是图像和数字。谢谢!

1 个答案:

答案 0 :(得分:2)

请记住,Racket(以及其他类似Lisp的语言)中的括号与其他语言中的括号不同……它们很重要!在许多语言中,x(x)((x))((((x))))之间没有区别,但是在Racket中,它们都是非常不同的表达式。

在球拍中,括号表示功能应用。也就是说,(f)就像用其他语言编写f(),所以((f))就像编写f()(),依此类推。这很重要,因为这意味着(3)之类的东西在Racket中都是非常荒谬的-就像用其他语言编写3()一样,而3绝对不是函数。

现在,让我们考虑一下您遇到的问题。您正在使用if,它具有以下语法:

(if conditional-expression then-expression else-expression)

这意味着if中的每个代码段本身都必须是有效的表达式。但是,请仔细查看您的 then-expression ,即('())。这有点像之前的(3)示例,不是吗? '()不是函数,因此不要用括号括起来!

您的 else-expression 出现了类似的问题,但是稍微复杂一点,因为您似乎希望在那里运行两个功能。如果您想运行第一个函数来产生副作用,则不会单独使用括号进行分组,而会使用begin,但我不清楚这是否是您真正想要的。无论如何,您的程序将按照编写的方式尝试将对my_save_image的调用结果作为函数应用,将其递归调用的结果传递给save_sheets作为参数,这几乎肯定不是您想要的。

请注意括号。在球拍中,应小心对待。