0
votes

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?

1
Brackets in Scheme are not like curly braces in other languages :) resist the temptation to open/close them in the places where you'd normally do so for curly braces, the conventions for indenting in Scheme are different.Óscar López

1 Answers

3
votes

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.