Hi Jarek! I tested your code. Good!
Only thing I found is type incompatibility in expressions e.g. <ifnot test="true>1"> or <ifnot test="endswith(true,false)"> throws INTERNAL ERROR System.ArgumentException: Object must be of type Boolean. at System.Boolean.CompareTo(Object obj) at NAnt.Core.ExpressionEval.ExpressionEvalBase.ParseRelationalExpression() in e:\src\extern\nant\src\NAnt.Core\ExpressionEval\ExpressionEvalBase.cs:line 195 All exceptions during function call or operator evaluation should be user BuildExceptions. Martin ----- Original Message ----- From: "Jaroslaw Kowalski" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]> Sent: Tuesday, December 02, 2003 11:09 PM Subject: [nant-dev] Expression Evaluator for NAnt - test1 > > Hi! > > Here's the first test release of the expression evaluator I'm developing for > NAnt. > I encourage everyone to try it. I'd like to get as much feedback as possible > on it. > > Please report: > > 1. Does it work for you? Bug reports are welcome. > 2. Is it useful? > 3. Do you find the syntax simple enough? Are the build files more/less > readable? > 4. Does it break your existing build files? (it shouldn't!) > 5. What functions/data types/conversions/operators/conversions should be > added/removed? > 6. What other features would you like to see? > > Pre-compiled binaries along with patches to current CVS code can be found > at: > http://jaak.sav.net/nant-ee/nant-ee-test1.zip > > Changes: > > * new attribute "test" for <if> and <ifnot> which lets you write: > > ===================================================== > <if test="property1 = property2 + '.txt'"> > ... > </if> > ===================================================== > > * support for expressions in (hopefully) all places where ${propertyname} > syntax could be used: > > ===================================================== > <property name="prop1" value="${'aaa' + 'bbb'}" /> > <echo message="length of prop1 is: ${length(prop1)}" if="${1+2=3}" /> > ===================================================== > > Jarek > > 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 (), properties can be > accessed just by providing their name > > 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 > bool(a) - converts a to boolean > > 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 > startswith(a,b) - equivalent to a.StartsWith(b) in .NET > endswith(a,b) - equivalent to a.EndsWith(b) 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); > > > > ------------------------------------------------------- > 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