Sounds good!

embedded expression should maybe use ${...} syntax unless we could break
some existing buildfiles.

how property expansion works together with expressions?

e.g.:
does <echo message="the length of the file is: %{filelength(${filename})}"
/>work
or should I write <echo message="the length of the file is:
%{filelength('${filename}')}" /> ?

Maybe, if expressions could use properties directly as variables there could
be more straightforward
%{filelength(filename)} or even with begining ${ to be compatible.
${property} than will be property or expression which is the same in that
case.

Martin

----- Original Message ----- 
From: "Jaroslaw Kowalski" <[EMAIL PROTECTED]>
To: "Martin Aliger" <[EMAIL PROTECTED]>; "Ian MacLean"
<[EMAIL PROTECTED]>
Cc: <[EMAIL PROTECTED]>
Sent: Tuesday, December 02, 2003 3:27 PM
Subject: Re: [nant-dev] PATCH: Expression evaluator for NAnt


> It's not in yet, but I'm working on adding this to NAnt (startswith and
> endswith will be there, too). Some preliminary version should be available
> before this weekend in a separate branch of NAnt.
>
> Expression evaluation will be supported in almost all places where you can
> specify in NAnt. So instead of:
>
> <echo message="aaaa" if="true" />
>
> you will be able to write:
>
> <echo message="aaaa" if="startswith('aaaa','a')" />
>
> This will work in for all attributes where non-string values are expected
> (if, timeout, unless, failonerror, verbose, and all task-specific
attributes
> like debug,optimize,etc.).
>
> For strings, I'm planning to provide embedded expressions, like:
>
> <echo message="the length of the file is: %{filelength(${filename})}" />
>
> What do you think?
>
> Jarek
>
> ----- Original Message ----- 
> From: "Martin Aliger" <[EMAIL PROTECTED]>
> To: "Ian MacLean" <[EMAIL PROTECTED]>; "Jaroslaw Kowalski"
> <[EMAIL PROTECTED]>
> Cc: <[EMAIL PROTECTED]>
> Sent: Tuesday, December 02, 2003 2:26 PM
> Subject: Re: [nant-dev] PATCH: Expression evaluator for NAnt
>
>
> > Great! Superb! Maybe I'd love to see startwith and endwith string
> functions
> > in addition, but great start as Ian said :)
> >
> > Is it in already?
> >
> > I tried: [with nant-20031128]
> >   <foreach item="String" in="${changes}" delim=" " property="folder">
> >       <property name="name" value="${folder}.dll"/>
> >       <if test="indexof('.Test.dll','${name}'==0">
> >         ...
> >
> > and no luck :( :
> >
> > BUILD FAILED
> >
> > C:\temp\server\GINIS.NET.build(84,5):
> >        [if]  at least one if condition must be set (propertytrue,
> > targetexists, etc...):
> >
> > Total time: 0.6 seconds.
> >
> > Martin
> >
> > ----- Original Message ----- 
> > From: "Ian MacLean" <[EMAIL PROTECTED]>
> > To: "Jaroslaw Kowalski" <[EMAIL PROTECTED]>
> > Cc: <[EMAIL PROTECTED]>
> > Sent: Friday, November 21, 2003 7:14 AM
> > Subject: Re: [nant-dev] PATCH: Expression evaluator for NAnt
> >
> >
> > > Jaroslaw,
> > > Awesome ! Checking it out now. Obviously this is another thing to go
in
> > > post 0.84 but this looks like a great start.
> > > Thanks !
> > >
> > > Ian
> > >
> > > >Hi!
> > > >
> > > >As I've promised some time ago on the list, I've implemented a
simple,
> > yet
> > > >very powerful, expression evaluator for NAnt. See below for a full
list
> > of
> > > >features.
> > > >You can now write quite sophisticated expressions, like:
> > > >
> > > ><if test="tolower(${somefilename}) = ${someotherfilename} + '.txt'">
> > > >...
> > > ></if>
> > > >
> > > >I've added my parser to "NAnt.Core.ExpressionEval" namespace and I've
> > > >modified
> > > ><if> and <ifnot> tasks to support a new attribute called "test"
(named
> > after
> > > >XSLT ;-)
> > > >
> > > >It's ultra-easy to add new functions. You simply add new public C#
> > function
> > > >in "NAnt/Core/ExpressionEval/ExpressionEvaluator.cs" and it works!
> > > >
> > > >The code should be considered alpha-quality, but should work in most
> > cases.
> > > >I've taken some well-tested parts from another project of mine, yet
> some
> > > >parts are new and they may not work correctly in 100% cases.
> > > >
> > > >Can someone please take a look at this patch and commit to CVS if
it's
> > ok?
> > > >
> > > >Jarek
> > > >
> > > >P.S. No NUnit-style unit tests yet, but I'm working on them.
> > > >
> > > >Full list of features:
> > > >======================
> > > >
> > > >Data types:
> > > >    integer, double, string, boolean and date
> > > >
> > > >Operators:
> > > >    and, or, not
> > > >    =, <>, <, >, <=, >= (because NAnt is XML I'm considering renaming
> > them
> > > >to lt, gt, le, ge)
> > > >    unary minus,
> > > >    +,-,*,/,%(modulo) with natural precedence, braces (), property
> > access:
> > > >${propertyname}
> > > >
> > > >Functions:
> > > >    propertyexists(name) - returns true when the property exists,
false
> > > >otherwise
> > > >    propertyvalue(name) - returns the value of the named property,
> fails
> > > >when it's not present
> > > >
> > > >Conversion operators:
> > > >    int(a) - converts a to integer (if possible) and returns the
value
> > > >    double(a) - converts a to double (if possible) and returns the
> value
> > > >    string(a) - converts a to string and returns the value
> > > >    date(a) - converts a to date
> > > >
> > > >String functions:
> > > >
> > > >    length(a) - returns the length of the string
> > > >    substring(a,b,c) - equivalent to a.Substring(b,c) in .NET
> > > >    tolower(s) - returns s converted to lower-case
> > > >    toupper(s) - returns s converted to upper-case
> > > >    contains(str,subs) - returns true when subs is a substring of str
> > > >    indexof(a,b) - equivalent to a.IndexOf(b) in .NET
> > > >    padleft(a,b,c) - equivalent to a.PadStart(a,b,c) in .NET
> > > >    padright(a,b,c) - equivalent to a.PadEnd(a,b,c) in .NET
> > > >    trim(a) - equivalent to a.Trim() in .NET
> > > >    trimstart(a) - equivalent to a.TrimStart() in .NET
> > > >    trimend(a) - equivalent to a.TrimEnd() in .NET
> > > >
> > > >Math functions:
> > > >
> > > >    round(v)
> > > >    floor(v)
> > > >    ceiling(v)
> > > >    abs(v)
> > > >
> > > >File functions:
> > > >
> > > >    getcreationtime(filename)
> > > >    getlastwritetime(file)
> > > >    getlastaccesstime(file)
> > > >    fileexists(file)
> > > >    filesize(file)
> > > >
> > > >Date functions:
> > > >
> > > >    now()
> > > >    datediff(d1,d2) - returns date difference in seconds
> > > >    dateadd(d1,seconds) - returns d1 + seconds
> > > >
> > > >Here are some examples of things that are known to work, taken from
my
> > unit
> > > >tests:
> > > >
> > > >Assert("1+2", 3);
> > > >Assert("1+2+3", 6);
> > > >Assert("1+2*3", 7);
> > > >Assert("2*1*3", 6);
> > > >Assert("1/2+3", 3);
> > > >Assert("5.0/(2+8)", 0.5);
> > > >Assert("double(5)/(2+8)", 0.5);
> > > >Assert("double(1)/2+3", 3.5);
> > > >Assert("((((1))))", 1);
> > > >Assert("((((1+2))))", 3);
> > > >Assert("((((1+2)+(2+1))))", 6);
> > > >Assert("((((1+2)/(2+1))))", 1);
> > > >Assert("length('')", 0);
> > > >Assert("length('')=0", true);
> > > >Assert("length('')=1", false);
> > > >Assert("length('test')", 4);
> > > >Assert("length('test')=4", true);
> > > >Assert("length('test')=5", false);
> > > >Assert("length('d''Artagnan')", 10);
> > > >Assert("length('d''Artagnan')=10", true);
> > > >Assert("length('d''Artagnan')=11", false);
> > > >Assert("-1", -1);
> > > >Assert("--1", 1);
> > > >Assert("'a' = 'a'", true);
> > > >Assert("'a' = 'b'", false);
> > > >Assert("'a' <> 'a'", false);
> > > >Assert("'a' <> 'b'", true);
> > > >Assert("1 = 1", true);
> > > >Assert("1 <> 1", false);
> > > >Assert("1 = 2", false);
> > > >Assert("1 <> 2", true);
> > > >Assert("1.0 = 1.0", true);
> > > >Assert("1.0 <> 1.0", false);
> > > >Assert("1.0 = 2.0", false);
> > > >Assert("1.0 <> 2.0", true);
> > > >Assert("true", true);
> > > >Assert("false", false);
> > > >Assert("true==true", true);
> > > >Assert("true==false", false);
> > > >Assert("true<>false", true);
> > > >Assert("true<>true", false);
> > > >Assert("!true", false);
> > > >Assert("!false", true);
> > > >Assert("!(1=1)", false);
> > > >Assert("substring('abcde',1,2)='bc'", true);
> > > >Assert("trim('  ab  ')='ab'", true);
> > > >Assert("trimstart('  ab  ')='ab  '", true);
> > > >Assert("trimend('  ab  ')='  ab'", true);
> > > >Assert("padleft('ab',5,'.')='...ab'", true);
> > > >Assert("padright('ab',5,'.')='ab...'", true);
> > > >Assert("indexof('abc','c')=2", true);
> > > >Assert("indexof('abc','d')=-1", true);
> > > >Assert("indexof('abc','d')=-1", true);
> > > >Assert("round(0.1)", 0.0);
> > > >Assert("round(0.7)", 1.0);
> > > >Assert("floor(0.1)", 0.0);
> > > >Assert("floor(0.7)", 0.0);
> > > >Assert("ceiling(0.1)", 1.0);
> > > >Assert("ceiling(0.7)", 1.0);
> > > >Assert("if(true,1,2)", 1);
> > > >Assert("if(true,'a','b')", "a");
> > > >Assert("if(false,'a','b')", "b");
> > > >Assert("abs(1)", 1.0);
> > > >Assert("abs(-1)", 1.0);
> > > >Assert("fileexists('c:\\notthere.txt')", false);
> > > >Assert("dateadd(${somedate},3600) = ${someotherdate}", true);
> > > >Assert("'a' + 'b' = 'ab'", true);
> > > >
> > > >
> > >
> > >
> > > -- 
> > > Ian MacLean, Developer,
> > > ActiveState, a division of Sophos
> > > http://www.ActiveState.com
> > >
> > >
> > >
> > >
> > > -------------------------------------------------------
> > > This SF.net email is sponsored by: SF.net Giveback Program.
> > > Does SourceForge.net help you be more productive?  Does it
> > > help you create better code?  SHARE THE LOVE, and help us help
> > > YOU!  Click Here: http://sourceforge.net/donate/
> > > _______________________________________________
> > > nant-developers mailing list
> > > [EMAIL PROTECTED]
> > > https://lists.sourceforge.net/lists/listinfo/nant-developers
> > >
> > >
> >
> >
> >
> > -------------------------------------------------------
> > This SF.net email is sponsored by: SF.net Giveback Program.
> > Does SourceForge.net help you be more productive?  Does it
> > help you create better code?  SHARE THE LOVE, and help us help
> > YOU!  Click Here: http://sourceforge.net/donate/
> > _______________________________________________
> > nant-developers mailing list
> > [EMAIL PROTECTED]
> > https://lists.sourceforge.net/lists/listinfo/nant-developers
> >
>
>



-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive?  Does it
help you create better code?  SHARE THE LOVE, and help us help
YOU!  Click Here: http://sourceforge.net/donate/
_______________________________________________
nant-developers mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/nant-developers

Reply via email to