1

抱歉,我刚开始使用球拍。我对此很陌生。我写了这段代码:

(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应该接受它吗?它的参数是图像和一个数字。谢谢!

4

1 回答 1

5

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

在 Racket 中,括号表示函数应用程序。也就是说,(f)就像f()用其他语言写作一样,((f))就像写作一样f()(),等等。这很重要,因为这意味着在 Racket 中类似这样的事情(3)是非常荒谬的——就像3()用其他语言编写一样,而且3绝对不是一个函数。

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

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

这意味着其中的每段代码都if必须是它们自己的有效表达式。但是,请仔细查看您的then-expression,即('()). 这有点像(3)前面的例子,不是吗?'()不是函数,所以不应该用括号括起来!

else-expression展示了一个类似的问题,但它有点复杂,因为您似乎希望在那里运行两个函数。如果您想为副作用运行第一个函数,您不会单独使用括号进行分组,而是使用begin,但我不清楚这是否是您真正想要的。在任何情况下,正如所写的那样,您的程序将尝试将调用的结果my_save_image作为函数应用,将递归调用的结果save_sheets作为参数传递给它,这几乎肯定不是您想要的。

注意你的括号。在球拍中,他们将被小心对待。

于 2018-07-12T06:40:37.760 回答