Scheme Racket/Lisp中出错:应为可应用于参数的过程

Scheme Racket/Lisp中出错:应为可应用于参数的过程,scheme,lisp,racket,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

只是一个新定义的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)
试试这个:

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

atan后有一对不必要的括号,请注意,正确缩进将使这类错误更容易发现。

错误类型是一种常见的错误类型-下面介绍如何快速发现程序中的错误

用球拍拍拍。请注意,此表达式的颜色为红色:

       (
         (/
          (sqrt (-
                 1 (expt (cos z) 2)))
          (cos z)))
错误消息说:“需要一个可应用于给定参数的过程”。最后一部分暗示Racket期望
(…)
是一个过程(函数)的应用程序。但是,第一个参数是:
(/…)
,除法的结果是一个数字

也就是说:当您遇到这个错误时,请始终查看第一个表达式

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

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

(operation argument1
           argument2
           ...)
在本例中:

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

解决了一个问题(这里有正确的代码:(define(arccos z)(atan(/(sqrt(-1(expt(cos z)2)))(cos z)))我建议正确缩进代码,然后检查语法正确性。当开始使用lisp时,此错误消息的实际意义几乎总是:“您有太多的参数。请记住,
{
不同。如果在
之后没有函数名(
),您可能不需要的():