[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