[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: macros vs. blocks




On Friday, November 22, 2002, at 02:26  AM, Trevor Blackwell wrote:

>
> John Clements <clements@brinckerhoff.org> writes:
>
>> Hmm.  If you consider the three largest categories of macros [*] to be
>> 1) those that affect evaluation order (if),
>> 2) those that introduce literal data (quote), and
>> 3) those that introduce bindings (let),
>> I don't see how block notation solves any other than category (1).
>
> I would refine my macros-are-useless claim a bit: languages that 
> already
> have syntax for things such as assignment, variable declaration, and
> quoted data (Python, Perl, Smalltalk, ...) don't benefit much from
> macros.
>
> Using macros for #2 is probably a bad idea. I think it's generally
> clearer to include the ' symbol (or whatever your favorite language
> uses) than to have some arguments be magically quoted.

Your use of ' indicates to me that you're speaking of Scheme here.  You 
may be surprised to discover that ' is (in some scheme systems) 
translated into (quote ...).  That is, the ' _becomes_ an instance of 
the thing you're protesting.

> Using macros for #3 is also usually a bad idea. Having macros like CL
> (do) or (while), which magically introduce a variable with non-obvious
> scoping, is hazardous. I'd rather just have one way of declaring
> control-structure variables, like Smalltalk:
>
>   list do: [:x |
>       x print.
>   ].
>
> where it's totally obvious what the scope of the variable is. Scheme
> succeeds here too, because it uses lambda semantics everywhere.

Again, you like what Scheme does, but the typical implementation for 
'let' is in fact exactly the sort of macro form I mention.

The difference between 'let' and CL's 'while' seems to be one of 
hygiene.  I agree that macros should be hygienic.

Ultimately, what you seem to be saying (if I can put words in your 
mouth) is that macros are okay, but only if they're part of the 
language definition.

john clements