groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Assia Alexandrova <kob...@gmail.com>
Subject Re: JSR 223 support behavior
Date Wed, 24 May 2017 03:16:18 GMT
Hi Paul,

Right....but unfortunately this is within the context of a notebook
tool that others are using to type in and evaluate Groovy code, so I
have no control (unless I do an AST transform as Jochen suggested). I
was surprised by this, but since Groovy's own REPL (groovysh) behaves
the same way, I think regular/experienced Groovy users should be ok
with it.

Regards

On Tue, May 23, 2017 at 7:31 AM, Paul King <paulk@asert.com.au> wrote:
> You can put things into the binding yourself if that helps:
>
> ------------
> import org.codehaus.groovy.jsr223.*
>
> def engine = new GroovyScriptEngineFactory().scriptEngine
> engine.put('something', 10)
> engine.eval('println something')
> ------------
>
> Cheers, Paul.
>
>
> On Tue, May 23, 2017 at 8:39 PM, Jochen Theodorou <blackdrag@gmx.org> wrote:
>>
>>
>>
>> On 23.05.2017 03:34, Assia Alexandrova wrote:
>>>
>>> Hi,
>>>
>>> Thanks for the prompt response!
>>>
>>> I am a bit confused. According to what appears to be the official
>>> language semantics:
>>>
>>> http://www.groovy-lang.org/semantics.html#_variable_definition
>>>
>>> the 'def' keyword is used to declare an untyped variable (i.e. one
>>> whose type is Object). So something like
>>>
>>> def x = 10
>>>
>>> is then presumably equivalent to two separate statements:
>>>
>>> def x
>>> x = 10
>>>
>>> What is the difference in semantics between 'def x = 10' and 'x = 10'?
>>
>>
>> "def x" declares a variable x in the current lexical scope.
>>
>> "x=10" is an assignment to the variable x. In Java the assignment has to
>> be done either together with the declaration or after (in a lexical sense)
>> the declaration. While Groovy has lexical scopes, Groovy also has some
>> constructs with dynamic scopes. Every Closure and every class container can
>> define such a dynamic scope. A script is also a class container. The
>> important point here is, that in a dynamic scope the declaration may not be
>> literal, but programmatically.
>>
>> So if you do println x, as script, then what are the scopes here? The
>> println method call actually is taken and put into a run method, which also
>> defines the scope. So the direct scope context for x is the same as the
>> method... besides the implicit method, nothing different to Java here yet.
>> The parent to the method scope is the class scope. In a script you cannot
>> easily define elements here. Unlike Java Groovy does not define this scope
>> as lexical, it defines it as dynamic. This means getProperty and setProperty
>> methods are used to get or set the value of "x". Thus x is not bound to a
>> declaration anymore.
>>
>> In a script these getProperty and setProperty methods will use the Binding
>> to get or set such a value. With the logic of "I can always set the value"
>> and "I can get the value only if it has been set before".
>>
>>> Can you point me to how docs where I can learn about transforms and
>>> write such a transform?
>>
>>
>> Take a look at
>> http://groovy-lang.org/metaprogramming.html#developing-ast-xforms
>>
>>> I'd like to understand if this behaviors is
>>> some side-effect of the implementation of the language or really
>>> designed following some rationale. In the latter case, cool, but in
>>> the former, I'd take a stab at a writing a transform.
>>
>>
>> well, I hope my explanation above sounds like the cool case ;)
>>
>>> The following REPL interaction seems too strange to me :-)
>>>
>>> groovy:000> def x = 10;
>>>
>>> ===> 10
>>>
>>> groovy:000> x
>>>
>>> Unknown property: x
>>
>>
>> hmmm... strange... I have the vague memory that somebody already fixed
>> that... ah... right... this is JSR-223 not groovysh. For groovysh we
>> actually do quite some things like transferring import statements and I
>> think also declaration of variables and methods. But JSR-223 was originally
>> intended to always get a complete script, thus we have no such things there.
>> If JSR223 would be in more wider use, we would probably offer a REPL mode
>> for it...
>>
>> bye Jochen
>
>

Mime
View raw message