Racket / Lisp中的错误:期望一个可以应用于参数的过程

时间:2015-10-21 15:50:27

标签: scheme lisp racket

只是一个新定义的arccos函数,但我找不到错误:

(define (arccos z)
  (atan (
         (/
         (sqrt (-
               1 (expt (cos z) 2)))
         (cos z)))))
你可以帮帮我吗? 错误讯息:

expected a procedure that can be applied to arguments
  given: 1.1447765772467506
  arguments...: [none]
for (arccos 1)

2 个答案:

答案 0 :(得分:2)

错误类型是常见的 - 所以这里是如何快速找出错误在程序中的位置。

在DrRacket中运行它。请注意,此表达式为红色:

       (
         (/
          (sqrt (-
                 1 (expt (cos z) 2)))
          (cos z)))

错误消息说:“预期可以应用于给定参数的过程”。最后一部分暗示Racket期望( ... )是一个过程(函数)的应用程序。但是第一个参数是:(/ ...),除法的结果是数字。

即:当您收到此错误时,请始终查看第一个表达式。

这里的问题是额外的一层括号( (/ ...) )应该是(/ ...)。在其他情况下,使用display打印出第一个表达式的结果,以便查看出现了什么问题。

注意:在处理算术运算时,使用以下缩进约定会很有帮助:

(operation argument1
           argument2
           ...)

在这个例子中:

  (atan (/ (sqrt (- 1
                    (expt (cos z) 2)))
           (cos z))))

答案 1 :(得分:1)

试试这个:

(define (arccos z)
  (atan (/ (sqrt (- 1 (expt (cos z) 2)))
           (cos z))))

atan之后有一对不必要的括号,同时注意正确缩进会使这种类型的错误更容易被发现。