From: Jaroslaw K. <ja...@zd...> - 2003-12-06 10:40:57
|
Hi Scott, As you requested, here's a summary of expression evaluator discussion: Ian, Gert, Martin - can you please correct me if I'm wrong anywhere in the summary. ======================================================== There are 2 questions: QUESTION 1: How should expressions be written? A) <echo message="aaa" if="${length(propertyname)=3}" /> B) <echo message="aaa" if="${length($propertyname)=3}" /> C) <echo message="aaa" if="${length(${propertyname})=3}" /> Variant A - is clean and compatible with current approach to accessing properties. Properties can still be accessed as ${propertyname}. This may have the following problems: - it may be hard to distinguish between property and function names because they only differ by () (Java, C#, C++ also have this problem). - we may no be able to access some properties (like nant.task.cvs-checkout.location) because they contain dashes which cannot be distinguished from "minus" operator. "a-b" could either be "a" MINUS "b" or a property named "a-b". Fortunately there are only 6 such properties in NAnt (so this could be quite easily resolved): nant.tasks.cvs-update nant.tasks.cvs-checkout nant.tasks.delay-sign nant.tasks.cvs-update.location nant.tasks.cvs-checkout.location nant.tasks.delay-sign.location There was a suggestion to disallow such property names and formally define them as: property name => identifier { DOT identifier } * identifier => [a-zA-Z_][a-zA-Z0-9_]* In English: "property name" is a sequence of "identifiers" separated by dots "identifier" starts with a latin letter or an underscore and contains only letters, digits underscores (like in C#, C++, Java, VB, JavaScript...) - we may not be compatible with property names which are numeric. I was told that currently a property can be named "1234". There seems to be an agreement that this should be disallowed asap. I suggest that we disallow properties containing dashes in their names at the same time. - one could always use use propertyvalue('propertyname') function to access weird-names properties Variant B - prefix properties with '$' - similar to PERL - is still quite clean, yet there are some dollars starting to appear - this solves the first problem (the properties can be distinguished because they are prefixed with $) - accessing properties with dashes can still be tricky: $property-name-with-dashes // access property $property-name-with-dashes(1) // $property-name-with MINUS dashes(1) Variant C - enclose properties in ${...} - it's difficult to read, especially when using proportional font, - it's unambiguous - no problem accessing any property Opinions on Q1: Jarek: A Martin: A Ian: A or B Gert: B or C QUESTION 2: Should we always require ${} (or anything else we use for quoting) to be written around expressions, or should we allow unquoted expressions in some places? Variant A (quote all expressions) <if test="${length(someproperty)=3}"> ... </if> <echo message="test" if ="${length(someproperty)=3}" /> <echo message="test" unless ="${length(someproperty)=3}" /> - it's simple - you ALWAYS use quotes around expressions (both embedded in strings and stand-alone) - you can easily spot the expressions in your build file - this may allow for easy implementation of syntax highlighting (actually I already did this for VIM) Variant B: allow for unquoted expressions in some places where non-string values are expected: Like "<if test="..." /> <... if="..." /> <... unless="..." /> <if test="length(someproperty)=3"> ... </if> <echo message="test" if="length(someproperty)=3" /> <echo message="test" unless="length(someproperty)=3" /> - this is somewhat more readable (less dollars) - it may be hard to find expressions in the build file. - it may not be clear when to use quotes and when not to use them Variant C: skip quotes for <if test="..." /> - keep for everything else - this is implemented in "test1" Opinions on Q2: Jarek: A Martin: A CURRENT STATUS: 1. Expression evaluator is in CVS in branch "EE-patches" 2. It implements variants: Q1:A and Q2:C A binary release of this is available at http://jaak.sav.net/nant-ee/nant-ee-test1.zip It contains some test cases written as a build file. Jarek |