How Scheme misunderstands infix expressions

> (2 + 3)
procedure application: expected procedure, given: 2; arguments were:
#<primitive:+> 3

When DrScheme sees the left parenthesis at the beginning of the expression (2 + 3), it expects the expression to be a procedure call, and it expects the procedure to be identified right after the left parenthesis. But 2 does not identify a procedure; it stands for a number. (A ``procedure application'' is the same thing as a procedure call.) Since it expected a procedure and was given a number instead, it gave up and printed out the error message instead of trying to carry out a command that it regarded as senseless.

The other expressions in a procedure call are supposed to identify its arguments, that is, the values to which the procedure should be applied. DrScheme looked at these expressions -- `+' and `3' -- and correctly noted that the former stands for the primitive procedure for addition (that's the ``#<primitive:+>'' stuff in the error message) and the latter for the number 3. DrScheme didn't see anything wrong with those; the only error it recognized was the error of putting an expression that doesn't identify a procedure right after the left parenthesis at the beginning of a procedure call.


> 7 * 9
7
#<primitive:*>
9

In the absence of parentheses, DrScheme sees 7 * 9 as three separate and unrelated expressions -- the numeral 7; *, a name for the primitive multiplication procedure; and 9, another numeral. It interprets each of these as a command to evaluate an expression: ``Compute the value of the numeral 7! Find out what the name * stands for! Compute the value of the numeral 9!'' So it performs the first of these commands and displays 7; then it carries out the second command, reporting that * is the name of the primitive procedure *; and finally it carries out the third command and displays the result, 9. This behavior is confusing, but it's strictly logical if you look at it from the computer's point of view (remembering, of course, that the computer has absolutely no common sense).


> sqrt(49)
#<primitive:sqrt>
procedure application: expected procedure, given: 49 (no arguments)

As in the preceding case, DrScheme sees sqrt(49) as two separate commands: sqrt means ``Find out what sqrt is!'' and (49) means ``Call the procedure 49, with no arguments!'' DrScheme responds to the first command by reporting that sqrt is the primitive procedure for computing square roots and to the second by pointing out that the number 49 is not a procedure.


This document is available on the World Wide Web as

http://www.cs.grinnell.edu/~stone/courses/scheme/labs/infix-explanations.xhtml

created July 26, 2001
last revised July 26, 2001

John David Stone (stone@cs.grinnell.edu)