球拍错误:需要一个可以应用于参数的过程

Jav*_*e01 1 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)))))
Run Code Online (Sandbox Code Playgroud)

当然,当我运行这个时,我收到以下错误:

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

(join_sheet (list-ref lst num))应该返回一个图像,错误显示该图像,但是my_save_image应该将其接收,对吗?它的参数是图像和数字。谢谢!

Ale*_*ing 6

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

\n\n

在Racket中,括号表示函数应用。也就是说,(f)就像f()用其他语言写作一样,就像((f))写作一样f()(),等等。这很重要,因为这意味着类似的东西(3)在 Racket\xe2\x80\x94 中是非常无意义的,就像3()用其他语言编写一样,并且3绝对不是一个函数。

\n\n

现在,让\xe2\x80\x99s 考虑一下你\xe2\x80\x99 遇到的问题。您正在使用if,它具有以下语法:

\n\n
(if conditional-expression then-expression else-expression)
Run Code Online (Sandbox Code Playgroud)\n\n

这意味着 中的每段代码if本身都必须是有效的表达式。然而,仔细看看你的then-expression,它是(\'()). 这有点像(3)之前的例子,是\xe2\x80\x99 吗?\'()不是函数,因此不应将其括在括号中!

\n\n

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

\n\n

注意你的括号。在 Racket 中,他们应该被小心对待。

\n