[racket-dev] very unhelpful beginner language error message, possible fix proposed

From: John Clements (clements at brinckerhoff.org)
Date: Fri Feb 10 17:38:01 EST 2012

A user on stackoverflow had a question about this code:

(define list-sum-odd
  (lambda (list)
      ((null? list) 0)
      ((odd? (car list)) (+ (car list) (list-sum-odd (cdr list))))
      (list-sum-odd (cdr list)))))

(list-sum-odd '(3 4 5))

... which signalled an error. In #lang racket, you get

"+: expects type <number> as 2nd argument, given: '(5); other arguments were: 3"

... which is the right error for #lang racket. The response showed him that he'd forgotten the "else" in his last clause.

"Ho Ho!" thought I. "Beginner Student Racket will give a much better error message." Actually, though, the error message was much worse: it highlighted the id "list-sum-odd" in what should have been the 'else' case, and wrote:

"list-sum-odd: expected a function call, but there is no open parenthesis before this function"

... which is really terrible, because there *IS* a parenthesis right before the function name. 

I can see perfectly clearly how this arises as the composition of macros; would it make sense for the 'cond' macro to check to see whether its test expression is a bare function name before rearranging the pieces and continuing with expansion?

Specifically, it looks like such a check could be inserted on line 1316 of teach.rkt, in this code:

 [(question answer)
			   (with-syntax ([verified (stepper-ignore-checker (syntax (verify-boolean question 'cond)))])
			     (syntax/loc clause (verified answer)))]

... where you could issue an error message for questions that are ids that are bound to user-defined functions--we have this information, right?

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4624 bytes
Desc: not available
URL: <http://lists.racket-lang.org/dev/archive/attachments/20120210/fea98e67/attachment.p7s>

Posted on the dev mailing list.