[plt-scheme] syntax form works in top-level env, but not when imported from module.

From: Hans Oesterholt-Dijkema (hdnews at gawab.com)
Date: Mon Nov 14 10:30:57 EST 2005

Matthias Felleisen wrote:

OK, I follow.

But is there a way around it? What I like to do
is conditionally expand to a variable or a symbol.
And can I put that in a module?

Thanks in advance,

Hans



>
> On Nov 14, 2005, at 1:53 AM, Hans Oesterholt wrote:
>
>> I figured that out, but why the different behaviour?
>> I first tried this with a plain 'if' statement, and it
>> got evaluated as well. Why? Shouldn't it be so that
>> only the condition of an if statement must be evaluated
>> and the code of the part to be executed that it implies?
>>
>> So
>>
>> (if ('like eq 'like) ('like) (* like like))
>>
>> shouldn't that be possible?
>
>
> I assume you agree that this is not a question of syntax. You can get 
> the same result with plain variables.
>
> The question is why module and top-level treat variables differently. 
> The top-level is a 'thing' that has evolved over the past five 
> decades. It is pragmatic from the perspective of very good hackers and 
> very bad ones. Pile on code after code after code and somehow the 
> resulting 'program' will work. Since you may not care about a 
> particular variable now, leave it free. (Historically the free 
> variable part came about because it's easy to get mutual recursion 
> that way.) As long as it is not now evaluated (inside of a thunk, 
> if-branch, etc) your program will work, mostly.
>
> The module part is a 'compilation unit' and thus a 'unit of good 
> code'. You can compile it and determine its meaning without anything 
> else. Since free variables don't have any meaning, we check for them 
> and raise an error when we see one. This forces the programmer to 
> provide some meaning for a variable, e.g. (define (like x) (error 'f 
> "undefined variable")) [This is intentionally stupid]. Later it is 
> replaced with something better but there is always a definition.
>
> -- Matthias
>
>
>
>
>>
>> Matthias Felleisen schreef:
>>
>>>
>>> On Nov 13, 2005, at 6:14 PM, Hans Oesterholt wrote:
>>>
>>>> (a like)
>>>
>>>
>>>
>>> expands into (a.is-op? 'like (lambda () (* like like))) and then is 
>>> checked for close-ness. Since like is not defined, the module isn't 
>>> well-formed.
>>>
>>> At the top-level, (a like) expands into the same code. But since 
>>> module isn't there, the code isn't checked for well-formedness. So 
>>> an unbound id is okay as long as you don't evaluate it.
>>>
>>> -- Matthias
>>>
>>
>




Posted on the users mailing list.