> This looks like a good idea. I'll think about it:
>
> We could have:
>
> <echo message="aaa ${length('aaa')}" if="someproperty" />
> <echo message="aaa ${length('aaa')}" if="length(someproperty) = 3" />
> <if test="contains(nant.settings.currentframework.description,
> 'Microsoft')">
>     <echo message="We're running on Microsoft!" />
> </if>
>
> But it may break some build scripts which use "length" and similar
keywords
> as property names. What should we do then?

true :-( Looks we couldn't be 100% compatible... Unless expression generator
allows to use "length" variable/property and "length()" function in the same
time.

> Also, since we use XML, there's a problem with <, <=, >, and >= operators
> which need to be written as &lt; &gt; which isn't very readable. Shouldn't
> we call the operators "lt", "le", "gt", "ge" (less than, less or equal,
> greater than, greater or equal) adding "eq" (for equality) and "ne" (for
> not-equality) ??? Or should we  allow for both forms?

I prefer plan &lt; xml syntax there. You could use other operators without
problem (even >). I was examining xml specs with cdata attributes, but it is
not included in xml (was in sgml i think!)

> This way you could have:
>
> <echo message="aaa" if="'aaa' eq someproperty" />
>
> Shoud unary boolean negation be "not" or "!"?
> Should binary boolean operators be "and", "or" or "||", "&&" (&amp;&amp;)
in
> XML)

I prefer "and", "or", "not" there. But it is just mine oppinion...


I'm looking forward to expression so much that this small details... :-)
Martin

>
> I'm awaiting your opinions.
>
> Jarek
>
> ----- Original Message ----- 
> From: "Martin Aliger" <[EMAIL PROTECTED]>
> To: "Jaroslaw Kowalski" <[EMAIL PROTECTED]>; "Ian MacLean"
> <[EMAIL PROTECTED]>
> Cc: <[EMAIL PROTECTED]>
> Sent: Tuesday, December 02, 2003 3:44 PM
> Subject: Re: [nant-dev] PATCH: Expression evaluator for NAnt
>
>
> > 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