[plt-scheme] slightly misleading error message
On Sat, 16 Dec 2006, Prabhakar Ragde wrote:
> I was checking whether mutation of parameters is forbidden in Advanced
> Student (which it should be, because the semantics don't explain it)
Hi Prabhakar,
The book does mention it in the third restriction in the Grammar section:
3. A set!-expression must occur in the lexical scope of a define that
introduces the set!-expression's left-hand side.
http://htdp.org/2003-09-26/Book/curriculum-Z-H-47.html#node_sec_38.2
> and my attempt to do so did result in an error message, but the message
> was:
>
> set!: expected a defined name after `set!', but found a function argument
> name
>
> with the first "n" in (set! n (add1 n)) highlighted. This is in v360. --PR
That sounds like a correct error message to me. What part do you feel is
misleading about it?
It's saying that it would like to see something like:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define gensym
(local
[(define n 0)
(define (next)
(begin (set! n (add1 n))
(string->symbol
(format "g~a" n)))
)]
next))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
where 'n' is a defined name. Here, the SET! is being used in a context
where the left hand side, 'n', is scoped by a DEFINE.
On the other hand:
;;;;;;;;;;;;;;;;;;;;;
(define (++ n)
(begin
(set! n (add1 n))
n))
;;;;;;;;;;;;;;;;;;;;;
shows that error message:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
set!: expected a defined name after `set!', but found a function argument
name in: n
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
because the 'n' here is introduced as a function argument, and not one
that was introduced by the DEFINE form.
Best of wishes!