Search code examples
conditional-statementsschemesicp

The object #f or #t is not applicable


I'm trying to create a function that gets the sum of the square of the larger 2 of 3 numbers passed in. (Its exercise 1.3 in SICP)

When I run the following code I get the error ";The object #f is not applicable." If I switch the 3 and the 1 in my function call the error message will say #t instead of #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)

I was assuming the appropriate condition would return true and I'd get the square of the larger two numbers. Could someone please explain why I'm getting this error instead?


Solution

  • There are too many brackets in front of cond and that's causing the problem:

    (cond (((and
    

    The proper syntax for your solution should be:

    (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)))))
    

    What was happening is that the condition evaluated to a boolean, and the unexpected surrounding brackets made it look like a procedure application, so you ended up with something like this:

    (#t 'something)
    

    Which of course fails, because #t or #f are not procedures and cannot be applied. Just be careful with the brackets and use a good IDE with syntax coloring and code formatting, and you won't have this problem again.