A user on stackoverflow had a question about this code:
(define list-sum-odd
(lambda (list)
(cond
((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?
John
smime.p7s
Description: S/MIME cryptographic signature
_________________________ Racket Developers list: http://lists.racket-lang.org/dev

