[racket] Different behavior when using (#%require scheme/base)

From: Sam Tobin-Hochstadt (samth at ccs.neu.edu)
Date: Tue Mar 8 07:50:16 EST 2011

`scheme/base' provides a binding called `exp', which requires 2
arguments.  When the compiler expands your definition, it looks at the
variable reference in the body of the function *before* it binds your
new `exp' definition.  Therefore, it uses the `exp' that it has in
scope at that time -- the one from `scheme/base'.

This is an instance of a general problem with compilation and
expansion at the top-level, and one of the many reasons why it's
better to write programs in modules.

On Tue, Mar 8, 2011 at 7:37 AM, Yaron Gonen <yaron.gonen at gmail.com> wrote:
> Hi,
> (I'm using Dr Scheme version 4.2.2, with language R5RS, and the "Disallow
> redefining" is not checked.)
>
> The following code works perfectly:
> (define exp
>   (lambda (b e)
>     (if (= e 0) 1
>         (* b (exp b (- e 1))))))
> (exp 2 5)
>
> However, when I include the line (#%require scheme/base), I get an error:
> exp: expects 1 argument, given 2: 2 4
>
> How is that possible?
>
> Many thanks,
> Yaron
>
> _________________________________________________
>  For list-related administrative tasks:
>  http://lists.racket-lang.org/listinfo/users
>



-- 
sam th
samth at ccs.neu.edu



Posted on the users mailing list.