[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: how expressive are they?
I didn't think the part I left out trivial; I would have written it if
I thought it trivial. (And I think five to eight hours --- the time
implied by your 70-80% figure --- a rather conservative estimate of
the time it would take to produce a really useful and convenient
database mapping layer.) I don't see how syntactic abstraction helps
any more with those things than with the bits I did implement. You
don't need macros to log updates and inserts to a transaction log;
therefore, you don't need macros to do arbitrary things on updates or
inserts.
See Kragen: I think we have a disconnect right here.
First of, I couldn't care less about Python, or Haskell, or
<insert-your-favorite-language> here.
A lot of people think that dealing with persistence is just logging
updates and inserts in a transaction log. (I used to think databases
were just smart data structures too when I went into industry :). The
real reason I think of this as a good example is because it often
illustrates the mapping/concepts/issues that such macro layers have to
deal w/ in terms of reducing the code one has to write -- and mapping
from whatever programming language you are dealing with on the one
hand (often OO) and SQL/relational concepts on the
other. Intrinsically, if you don't deal w/ rollback/errors, or
multi-user issues, your code isn't dealing with the kinds of issues we
often care about. Intrinsically, if the syntax you invent to deal w/
these sorts of mappings is NOT different from the base language or
primitives thereof (reflection, or not, I don't really care), then
you've missed the point. Some of the papers that talk about macros
that Anton and others have posted make this point more accurately than
I can here.
You don't need macros to create classes on the fly (although
I didn't; all the instances belong to the same Python class) from a
list of strings naming the fields; therefore, you don't need macros to
create classes on the fly from a database schema you get from your
database server.
This is another place where the disconnect shows and this argument is
getting pointless. They key is what you said earlier - that you can do
this sort of thing to various sorts of degrees in "some" sub-set of
languages.
I just implemented the parts to which macros seemed relevant, like the
ability to miraculously turn ordinary assignment statements into
arbitrary code execution. I assert that you can do the rest without
macros and without per-class code duplication too --- for an example
of most of the facilities you want, I guess you could look at Zope ---
but it surprises me that the example I posted doesn't provide
sufficient evidence of this to you.
I know zope, and know it is powerful. It doesn't change my opinions
about macros one bit -- I say that because I've written lots of
repetitive DTML/python too :) And Zope's transaction model only works
in certain limited cases (and yes I know about clustering and what
Zope offers in terms of load-balancing).
I don't know that I necessarily like reflection better than macros ---
both take a lot of effort to maintain and debug, and I'd like to see a
macro-based implementation of facilities similar to those provided by
the Python example I posted --- but I assert that you can do all the
things you have described your object managers doing in Python with
reflection: getattr, setattr, __dict__, dir, __getattr__, and
__setattr__. I offer the program in my previous post as evidence, if
not proof.
I don't care a bit about Python, really. The reason that APL or Matlab has
certain kinds of array operators means that you can write certain kinds
of programs shorter in those languages in others. We are talking about
a "general language feature" not one language vs. another. People like
me keep saying "we find macros useful" and you and others keep warping
our argument to "we find macros more powerful" and spend a great deal
of time trying to put "your understanding of what macros do" into some
example or other. I now understand Dan's wisdom of saying "macros are
heavy duty tools for heavy duty jobs" and leaving it at that.
I do wish you'd try to do what your example does in C or Java or C#
(macros may be less relevant to languages such as Perl, Python,
Smalltalk and dialects of Lisp -- even though no doubt, such options
have been considered several times over the objections of idealogues).