Racket Error: Expected a procedure that can be applied to arguments
Racket Error: Expected a procedure that can be applied to arguments
抱歉,我刚开始使用球拍。我对此很陌生。我写过这段代码:
(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))
应该 return 一个图像,错误显示,但是 my_save_image
应该接受它,对吗?它的参数是图像和数字。谢谢!
请记住,Racket(和其他类似 Lisp 的语言)中的圆括号与其他语言中的圆括号不同……它们很重要!在很多语言中,x
、(x)
、((x))
、((((x))))
并没有区别,但是在Racket中,这些都是非常不同的表达方式。
在Racket中,括号表示函数应用。也就是说,(f)
就像用其他语言写 f()
,所以 ((f))
就像写 f()()
,等等。这很重要,因为它意味着像 (3)
这样的东西在 Racket 中是非常荒谬的——这就像用其他语言写 3()
一样,而 3
绝对不是一个函数。
现在,让我们考虑一下您遇到的问题。您正在使用 if
,它具有以下语法:
(if <i>conditional-expression</i> <i>then-expression</i> <i>else-expression</i>)
这意味着 if
中的每段代码本身都必须是有效的表达式。不过仔细看看你的then-expression
,也就是('())
。这有点像前面的 (3)
示例,不是吗? '()
不是函数,所以不应该用括号括起来!
您的 else-expression
表现出类似的问题,但有点复杂,因为您似乎希望 运行 那里有两个功能。如果你想 运行 副作用的第一个函数,你不会单独使用括号进行分组,你会使用 begin
,但我不清楚这是否是你真正想要的.在任何情况下,如所写,您的程序将尝试 将调用 my_save_image
的结果作为函数 应用,将递归调用 [=] 的结果传递给它30=] 作为参数,这几乎肯定不是你想要的。
注意括号。在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))
应该 return 一个图像,错误显示,但是 my_save_image
应该接受它,对吗?它的参数是图像和数字。谢谢!
请记住,Racket(和其他类似 Lisp 的语言)中的圆括号与其他语言中的圆括号不同……它们很重要!在很多语言中,x
、(x)
、((x))
、((((x))))
并没有区别,但是在Racket中,这些都是非常不同的表达方式。
在Racket中,括号表示函数应用。也就是说,(f)
就像用其他语言写 f()
,所以 ((f))
就像写 f()()
,等等。这很重要,因为它意味着像 (3)
这样的东西在 Racket 中是非常荒谬的——这就像用其他语言写 3()
一样,而 3
绝对不是一个函数。
现在,让我们考虑一下您遇到的问题。您正在使用 if
,它具有以下语法:
(if <i>conditional-expression</i> <i>then-expression</i> <i>else-expression</i>)
这意味着 if
中的每段代码本身都必须是有效的表达式。不过仔细看看你的then-expression
,也就是('())
。这有点像前面的 (3)
示例,不是吗? '()
不是函数,所以不应该用括号括起来!
您的 else-expression
表现出类似的问题,但有点复杂,因为您似乎希望 运行 那里有两个功能。如果你想 运行 副作用的第一个函数,你不会单独使用括号进行分组,你会使用 begin
,但我不清楚这是否是你真正想要的.在任何情况下,如所写,您的程序将尝试 将调用 my_save_image
的结果作为函数 应用,将递归调用 [=] 的结果传递给它30=] 作为参数,这几乎肯定不是你想要的。
注意括号。在Racket中,他们要小心对待。