【问题标题】:Error in Racket/Lisp: expected a procedure that can be applied to argumentsRacket/Lisp 中的错误:期望一个可应用于参数的过程
【发布时间】:2015-10-21 15:50:27
【问题描述】:

只是一个新定义的 arccos-function 但我没有发现错误:

(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))) )
  • 我建议正确缩进代码,然后检查语法正确性。
  • 开始使用 lisp 时,此错误消息的实际含义几乎总是:“你有太多括号。记住 ( 不像 {。如果你不在( 后面有一个函数名,你可能不需要(。” :)

标签: scheme lisp racket


【解决方案1】:

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

在 DrRacket 中运行它。注意这个表达式是红色的:

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

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

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

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

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

(operation argument1
           argument2
           ...)

在这个例子中:

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

【讨论】:

    【解决方案2】:

    试试这个:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多