On Thu, Aug 20, 2009 at 13:40, Derek Baum <derek.b...@paremus.com> wrote:

> >> FELIX-1471 proposes using () for grouping and $() for evaluation.
> >> So the above example would become:
> >>  > x = (echo aa; (echo ab; echo ac | grep -n a | tac))
> >>
> >
> > Not sure about this one.
> > I guess i've been fooled in my testing by the fact that when evaluating a
> > command, you have two results: the output on the console and the object
> > returned by the command.
> > We need to handle both at some point.
> > But for this, we need to exactly define when the returned object will be
> > printed to the console (or the piped output stream).
> >
>
> Yes, I raised FELIX-1474 about the implicit writing of command results to
> pipes.
> We should discuss this separately to avoid complicating this thread.
>
>
> > The next question is what happens when "..." is defined by multiple
> tokens:
> >> x = a b
> > What does that mean ?  I'm not sure of the answer.
>
> It assigns x the result of the command: a b
> See Peter's initial comment in this thread:
>
> >>> a = hello world
> >>>Is NOT a = "hello world". And I do not think it should be.
>
>
> > The patch for FELIX-1325 alter this behavior and reject any assignment
> with multiple arguments.
>
> I don't think that this is necessary. RFC-132 explicitly allows this
> (4.13 Command calling):
>      <string> '=' <value> +       execute values as statements, set
> result as variable
>
> However, if a single value is used in an assignment, then it shouldn't
> be executed, so:
>   x = echo
> does NOT set x to "" (the result of echo).
>

Isn't that a bit worrying to have the same syntax behaving in different ways
depending on the number of arguments ?


>
>
> >> FWIW I still think it is possible to solve this without introducing $(),
>
> > This made me think a bit differently.  The real issue is not about
> grouping
> > / evaluating.
> > Currently, the < > operator means: evaluate the command line inside and
> > return the value.
> > The real problem comes from the fact that the number of evaluations is
> > wrong.
> > So I came up with a new simplier patch that I think solve the issue while
> > keeping <> as you mentionned.
> > I've attached it to FELIX-1471 and it's available at
> >
> https://issues.apache.org/jira/secure/attachment/12417086/FELIX-1471-2.patch
> > It also includes a fix for FELIX-1325 and FELIX-1498, and introduce a new
> > "eval" keyword.
>
>
> > Let me know what you think, but this looks like a cleaner solution.
>
> Yes, this is much cleaner. I mentioned the use of an eval function
> earlier in this thread.
>
> I have tested FELIX-1471-2.patch and although mostly OK, e.g.
>
> ka...@root> <echo a a; <echo a b; echo ac | grep -n a | tac>>
> a a
>     1  a b     3  ac
>
> as expected.
>
> I don't like the new assignment restriction:
>
> ka...@root> x = <echo a a; <echo a b; echo ac | grep -n a | tac>>
> a a
> pipe: java.lang.IllegalArgumentException: Assignements can only have a
> single argument
>
>
> ka...@root> x = <echo hello world>
> hello world
> ka...@root> echo $x
> null
>
> ensure we are using osgi:echo (which returns a String):
> ka...@root> SCOPE=osgi:*
> osgi:*
>
> ka...@root> x = <echo hello world>
> pipe: java.lang.IllegalArgumentException: Assignements can only have a
> single
> agument
>
> ka...@root> x = '<echo hello world>'
> hello world
>
>
> I have further simplified FELIX-1471-2.patch and created FELIX-1471-3.patch
>
> https://issues.apache.org/jira/secure/attachment/12417131/FELIX-1471-3.patch
>
>  1. removes restriction that assignments only have single argument
>  2. removes code to re-parse string results - not needed now we have eval()
>      (eval is now a regular command like tac, rather than a special
> keyword).


For re-parsing the results, i think this is an important feature, regardless
of eval()
If we don't reparse the arguments, then
> a = "echo b"; eval $a
would throw an unknown command exception "echo b" as "echo b" would be
considered a single argument.
I think in this case, we should have
> $a
b
> eval $a
b

If you don't want this behavior, you can enclose $a in double quotes.

I disagree with having eval as a command.  The reason is that is has two
sides effects:
  * all parameters are evaluated once more, so that $xxx expansion will be
done once again, and it could lead to unwanted results
  * all parameters are converted to strings, which i think is not what is
expected.
I much rather the previous behavior and keep eval as a keyword instead.


>
>  3. updated tests
>
> Let me know if this works for you.
>
> Derek
>



-- 
Cheers,
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/
------------------------
Open Source SOA
http://fusesource.com

Reply via email to