[racket] why do I get undefined , when using internal definition?

From: Eli Barzilay (eli at barzilay.org)
Date: Sun Jul 10 01:58:47 EDT 2011

10 minutes ago, Veer wrote:
> Following code returns #<undefined> :
> 
> (define (make-color color)
>  (define color color)
>  color)
> 
> (make-color 'red)  ;; => #<undefined>
> 
> From the guide , I get that internal definition of color is not initialized
> therefore the result is #<undefined> . What does not initialized means
> in this context.

You're defining a new `color', one that shadows the `color' input.  If
you click check-syntax and hover over the different `color's you'll
see helpful arrows that indicate the bindings.  (For the argument
you'll see *no* errors.)  `define' is basically defining a new
identifier -- it's different from `set!', and sometimes confused since
in many languages `=' is used for both.


> My assumption was that internal color will be bound to the value of
> argument.
> 
> When was #<undefined> introduced (or it was always there).

It was always there.  (Or at least since the time I started using
MzScheme, which was around 1854.)


> I "think" I have used this type of code before , and it worked fine
> then.

No, it always did that...

-- 
          ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:
                    http://barzilay.org/                   Maze is Life!


Posted on the users mailing list.