ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stefan Bodewig <bode...@apache.org>
Subject Re: macrodef - do attributes as properties or substitutions
Date Fri, 14 Nov 2003 10:53:06 GMT
On Wed, 12 Nov 2003, Jose Alberto Fernandez
<jalberto@cellectivity.com> wrote:

[scriptdef and beanshell]

> Line numbers never match with that of the srcfiles.  But back to the
> topic.

Looks as if Peter sees the same - a BSF problem of not passing the
correct line number in?

> I want macrodef for when all I need to do is to put toguether
> a group of calls to other tasks in a sequence, which could be
> quite complex, but it does not require any additional computation
> from my part:

And I don't want to take that away - neither from you nor anybody else
8-)

> From: Stefan Bodewig [mailto:bodewig@apache.org] 
>
>> In which situation would "<atributes> modify properties" have 
>> negative effects on what you are planing to do with 
>> <macrodef>?  Do you have an enlightening example?

[attribute is called debug and would shadow a debug property]

> <presetdef name="my.javac">
>    <javac srcdir="src" destdir="classes"
>            deprecation="${deprecation}" debug="${debug}"/>
> </presetdef>

I'd expect that the properties have been expanded at the point of
<presetdef> already so there shouldn't be any shadow affecting that
definition.

> No here the intention of the code writer was to control javac using
> the debug property. But just because I decided to write myMacro with
> an attribute called debug, I am changing the behavior of
> my.java. (if we use locals)

Only if the expansion of properties in presetdef is performed in the
scope of the macro invocation and not at definition time.  But we
could simple use your example with

   <myMacro debug="true">
     <code>
       <echo>${debug}</echo>
     </code>
   </myMacro>

and ask ourselves what the user wanted to say here.  I agree that we
remove the ambiguity when attributes are not properties.

> But wait, what if I actually wanted to change the property?
> Well, in that case you can introduce the <local> yourself
> as part of the code of the macro:

I knew you'd say that (and I even came to this conclusion all by
myself already ;-).

Peter, Jan, now that we've seen Jose Alberto's use case - what can
macrodef do when we use (local) properties that can't be done with
textual substitutions?  I may be willing to swallow <local> in 1.6
even if macrodef attributes don't use it.

The main problems other languages have with macros as textual
replacements (i.e. Lisp's defmacro or C's #define) is that the
expression you pass in may be evaluated more than one.  
I.e. #define square(x) x * x and used as square(i++) may lead to
unexpected results.

The only expression evaluation we have in Ant is property expansion
and that would have been performed before the value of the attribute
gets used - and exactly once - no matter how we implement it, wouldn't
it?

Stefan

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Mime
View raw message