对象#f 或#t 不适用

The object #f or #t is not applicable

我正在尝试创建一个函数来获取传入的 3 个数字中较大的 2 个的平方和。(SICP 中的练习 1.3)

当我 运行 以下代码时,出现错误“;对象 #f 不适用。”如果我在我的函数调用中切换 3 和 1,错误消息将显示 #t 而不是 #f.

(define (sumOfSquareOfLargerTwoNumbers a b c) (
  cond (
    ( (and (> (+ a b) (+ a c) ) (> (+ a b) (+ b c) ) ) (+ (square a) (square b) ) ) 
    ( (and (> (+ a c) (+ a b) ) (> (+ a c) (+ b c) ) ) (+ (square a) (square c) ) )
    ( (and (> (+ b c) (+ a b) ) (> (+ b c) (+ a c) ) ) (+ (square b) (square c) ) )
  )
))

(sumOfSquareOfLargerTwoNumbers 1 2 3)

我假设适当的条件 return 为真,我会得到两个较大数字的平方。有人可以解释为什么我会收到此错误吗?

cond 前面的括号太多,这是导致问题的原因:

(cond (((and

您的解决方案的正确语法应该是:

(define (sumOfSquareOfLargerTwoNumbers a b c)
  (cond ((and (> (+ a b) (+ a c)) (> (+ a b) (+ b c)))
         (+ (square a) (square b)))
        ((and (> (+ a c) (+ a b)) (> (+ a c) (+ b c)))
         (+ (square a) (square c)))
        ((and (> (+ b c) (+ a b)) (> (+ b c) (+ a c)))
         (+ (square b) (square c)))))

发生的事情是条件评估为布尔值,意外的括号使它看起来像一个过程应用程序,所以你最终得到这样的东西:

(#t 'something)

当然失败了,因为#t#f不是程序,不能应用。只要小心括号并使用带有语法着色和代码格式的良好 IDE,你就不会再遇到这个问题了。