>> > 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 ?

bash behaves like this - you only have to quote assignments containing
multiple words:

$ x=hello
$ x=hello world
-bash: world: command not found
$ x='hello world'

However, I can also see the argument for making execution explicit, so
if you wanted to assign the result of executing hello, RFC-132 allows:
    x = hello world

but I agree it is clearer to be explicit:
    x = <hello world>

Note: FELIX-1471-2.patch does NOT currently allow this:

    > x = <echo hello world>
    java.lang.IllegalArgumentException: Assignements can only have a
single agument

Surely the result of <> should be a single argument?

You now have to quote the <>, which is not intuitive:
    > x = "<echo hello world>"
    hello world



> 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.

This depends on the implementation of eval.

In FELIX-1471-3.patch, I have removed the implicit re-parsing and
implemented eval as (effectively):
    session.execute(args);

eval can then be used to explicitly re-parse as required:

Our two approaches (2.patch and 3.patch) initially seem similar:

2.patch:
    > x = "<echo echo a>"
    echo a
    > eval $x
    a

3.patch:
    > x = <echo echo a>
    echo a
    > eval $x
    a

However, more complex examples, yield different results:

2.patch:
    > eval "echo hello"
    java.lang.IllegalArgumentException: Command not found:  *:echo hello

    > x = "echo a; echo b"
    echo a; echo b
    > eval $x
    a
result should be 'b'?

    > prog = 'x = {echo xxx $it}; x hello'
    x = org.apache.felix.gogo.runtime.shell.clos...@87e9b2; x hello
    > eval $prog
    org.apache.felix.gogo.runtime.shell.clos...@87e9b2


3.patch:
    > eval "echo hello"
    hello

    > x = "echo a; echo b"
    echo a; echo b
    > eval $x
    b

    >  prog = 'x = {echo xxx $it}; x hello'
    x = {echo xxx $it}; x hello
    > eval $prog
    xxx hello



> I think in this case, we should have
>> $a
> b
>> eval $a
> b

2.patch alllows:
    > $a
    b

while 3.patch requires explicit eval:
    > eval $a
    b
    > $a
    java.lang.IllegalArgumentException: Command not found:  *:echo b


> 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

this is offset by not implicitly evaluating the args - re-evaluation
only occurs when explicitly invoking eval.

>  * all parameters are converted to strings, which i think is not what is 
> expected.

I'm not sure this is a problem. The 3.patch eval is like eval in bash,
and can be used to re-evaluate a string as a script.

Derek

Reply via email to