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

Re: need for macros (was Re: Icon)



It has the form of a new binding construct, sure, but the
key thing is that the unique id is generated at compile
time.  Suppose we toss the binding construct and just use
a lambda to create the binding:

((fn (x) ...
   (input type 'submit value "Submit" name x)
    ...))
  (a-unique-id))

(mac a-unique-id () `',(unique-id))

see what I mean?  The point is that a-unique-id expands
at compile time into a unique id at that point in the
source code.
  
--- Matthias Felleisen <matthias@ccs.neu.edu> wrote:
> 
> That's a new binding construct. In 
> 
>  (with-unique-id var body ...) 
> 
> var is bound to something unique in body ... 
> 
> -- Matthias
> 
>   > Date: Thu, 20 Dec 2001 18:57:45 -0800 (PST)
>   > From: Paul Graham <paulgraham@yahoo.com>
>   > Content-Type: text/plain; charset=us-ascii
>   > 
>   > I've never been able to come up with a list of what you
>   > can use macros for.  I continue to be surprised by what
>   > you can do with them.  For example, at one point in 
>   > the Arc code I'm writing I needed to create a block with
>   > a unique identifier, so I know which button someone
>   > clicked.  The code is going to be evaluated multiple
>   > times and the identifier associated with each button has
>   > to be the same.  Answer: create the identifier at compile-
>   > time:
>   > 
>   > (mac with-unique-id (var . body)
>   >   `(let ,var ',(unique-id)
>   >      ,.body))
>   > 
>   > where unique-id is a function that returns an id-string 
>   > guaranteed (since starting Arc) to be unique.  Then you
>   > can say in the code that makes the html page
>   > 
>   > (with-unique-id x
>   >   ...
>   >   (input type 'submit value "Submit" name x)
>   >   ...)
>   > 
>   > And every button everywhere in your code has a single
>   > distinct name.
>   > 
>   > This use of macros doesn't seem to be on your list.
>   > 
>   > 
>   > --- Matthias Felleisen <matthias@ccs.neu.edu> wrote:
>   > > 
>   > > la@iki.fi writes: 
>   > > 
>   > >   Note that there is no need for any syntax transformations,
> this is
>   > > pure
>   > >   Haskell. You can get surprisingly far without macros when
> just
>   > > about
>   > >   everything is a first-class value...
>   > > 
>   > > That's not true. There are three reasons for introducing a
> syntactic
>   > > abstraction (macro) rather than a function:
>   > > 
>   > >  1. new binding forms
>   > >  2. implicit quoting or, more generally, a data sub-language
>   > >  3. an order of evaluation that is incompatible with evaluation
> 
>   > > 
>   > > A lazy language makes macros fro 3 unnecessary. A function with
>   > > first-class
>   > > functions still needs macros for 1; otherwise you keep writing 
>   > >   foo (fn x => ...)
>   > > all over the place. 
>   > > 
>   > > -- Matthias
>   > > 
>   > >   
>   > > 
>   > 
>   > 
>   > __________________________________________________
>   > Do You Yahoo!?
>   > Check out Yahoo! Shopping and Yahoo! Auctions for all of
>   > your unique holiday gifts! Buy at http://shopping.yahoo.com
>   > or bid at http://auctions.yahoo.com
>   > 


__________________________________________________
Do You Yahoo!?
Check out Yahoo! Shopping and Yahoo! Auctions for all of
your unique holiday gifts! Buy at http://shopping.yahoo.com
or bid at http://auctions.yahoo.com