Hi, ludo@chbouib.org (Ludovic Courtès) writes: > Actually, no: the test does a `define' _within_ the body of `begin', so > I *think* this qualifies as an internal define, and internal defines are > equivalent to `letrec' (Section 5.2.2). I was wrong: `define' within `begin' does not qualify as an "internal define", so the test "binding is created before expression is evaluated" was incorrect (or over-specified compared to R5RS[*]). After further discussion with Andy, I committed the patch below to HEAD. It inverts the order of expression evaluation and `scm_sym2var' in `scm_m_define ()' (which is concerned only with top-level defines), thereby fixing the `(define round round)' case. At the same time, it breaks the aforementioned test from `syntax.test', but there's nothing wrong with that. For 1.8, I'm pretty much inclined to commit a similar patch, i.e., where `module-make-local-var!' and `scm_m_define' are copied from HEAD. This would break code that does things like: (define foo (begin (set! foo 1) (+ foo 1))) but I think it's reasonable to break such code (which relies on non-R5RS-compliant behavior anyway), especially given the performance gain we get in return. What do you think? Thanks, Ludovic. [*] FWIW, the wording for `define' in the newly-released R5.93RS (Section 9.3.1) is the same as that of R5RS (Section 5.2.1).