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

the uses of macros (Re: various recent ll1 threads)




At Sat, 25 May 2002 05:01:07 -0400 (EDT), Kragen Sitaker wrote:
> I thought I'd reply to recent LL1 traffic with one message instead of
> several.

> 
> So you can go some distance in the direction of syntactic abstraction
> in Python with operator overloading.  But I often wish for more, for a
> variety of reasons explained in _On Lisp_.  Most often, I wish for
> unwind-protect macros (Scheme's with-open-file, for example, and
> sometimes I wish for an analogous with-lock-held) and new binding
> constructs, although I would like these to be merely a more convenient
> interface to existing functions.
> 

I'd like to propose that there are three disciplined uses of macros: 

1. data sublanguages: I can write simple looking expressions and 
create complex nested lists/arrays/tables with quote, unquote etc
neatly dressed up with macros. 

2. binding constructs: I can introduce new binding constructs with 
macros. That helps me get rid of lambda's and with placing things 
closer together that belong together. For example, one of our teachpacks
contains a form 
  (web-query ([last-name
                (string-append "Hello " first-name " what's your last name?"])
    ... last-name ... first-name ...)
with the obvious interaction between a program and a Web consumer implied. 
  [Note: In ML you could write 
     web-query(fn last-name => ...)string_append(...)
   but by golly that's a pain and an unnecessary pattern.]


3. evaluation reordering: I can introduce constructs that delay/postpone 
the evaluation of expressions as needed. Think of loops, new conditionals, 
delay/force, etc. 
  [Note: In Haskell, you don't need that one.]

I understand that Lispers use macros for other reasons. In all honesty, I 
believe that this is partly due to compiler deficiencies, and partly due to 
"semantic" irregularities in the target language. 

I challenge people to address all three issues when they say language X 
can do what macros can do. 

-- Matthias