【问题标题】:Racket Error: Expected a procedure that can be applied to arguments [duplicate]球拍错误:需要一个可应用于参数的过程[重复]
【发布时间】:2018-12-20 05:58:39
【问题描述】:

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

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

【问题讨论】:

    标签: racket dr.racket


    【解决方案1】:

    请记住,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,并将递归调用的结果作为参数传递给save_sheets,这几乎肯定不是你想要的。

    注意括号。在 Racket 中,他们将被小心对待。

    【讨论】:

    • 我的问题有点像你的答案,只是它是 join_sheet 返回的。我把额外的括号放在那里。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    相关资源
    最近更新 更多