Hello,

> I think this is generally on the right track as there aren't many other
> tracks to get this to work. Is it possible to leave open the option for a
> language that is translating into itself (e.g. javascript to javascript) to
> have the ability to take a non-string lambda if it is a language that is
> capable of inspecting itself to get the string representation of its own
> code?

Yes. So with Python we can inspect the lambda. Thus, if you are in CPython and 
want to submit a Gremlin-Python traversal to GremlinServer running Jython, then 
the PythonTranslator would NOT just evaluate the lambda for a String, but 
instead would do the following — inspect the lambda for a String:

>>> from dill.source import getsource
>>> x = lambda a: a + 2
>>> x
<function <lambda> at 0x10bfe70c8>
>>> getsource(x)
'x = lambda a: a + 2\n'
>>>

Realize that since we have decoupled the “translator” from the “language,” 
anyone can use Gremlin-Python and write their own translator. That translator 
can do as they please with each step(args). Thus, CPython->Jython can do as 
above with lambdas and introspect to get the code string during translation. 
For Gremlin-Python with GroovyTranslator, the best I have come up with is:

>>> g.V().out().map(lambda: "it.get().value('name')")
g.V().out().map({it.get().value('name')})

Now, another drawback of “the best I have come up with" is that the 
translator’s target language is showing up in the host language. That is, the 
traversal above is forced to use a GroovyTranslator and thus is not portable to 
any other translator. While, if a traversal did NOT have lambdas, you could 
easily change the translator and everything would just work as expected.

Take care,
Marko.

http://markorodriguez.com


> 
> On Thu, Jun 16, 2016 at 2:12 AM, Daniel Kuppitz <[email protected]> wrote:
> 
>> I wouldn't say that I like it, cause code as a String will always be very
>> error prone, but still, it's likely the only way to get lambdas working in
>> all language variants. Hence: "cool".
>> 
>> Cheers,
>> Daniel
>> 
>> 
>> On Thu, Jun 16, 2016 at 12:03 AM, Marko Rodriguez <[email protected]>
>> wrote:
>> 
>>> Hi,
>>> 
>>> What do people think of this idea:
>>> 
>>>        https://gist.github.com/okram/df6a104bde51a4f4f6f0da11f46909d5 <
>>> https://gist.github.com/okram/df6a104bde51a4f4f6f0da11f46909d5>
>>> 
>>> If you pass a lambda/closure/anonymousFunction/etc. in the respective
>>> language (during translation), it calls it to get the string
>>> representation. … ?
>>> 
>>> Marko.
>>> 
>>> http://markorodriguez.com
>>> 
>>> 
>>> 
>>>> On Jun 15, 2016, at 10:50 AM, Marko Rodriguez <[email protected]>
>>> wrote:
>>>> 
>>>> Hello,
>>>> 
>>>> I think we should introduce an S object. It would stand for Script and
>>> would allow you to do:
>>>> 
>>>> S.f(“{ it.length }”)
>>>> 
>>>> Where does this come in handy? Language variants.
>>>> 
>>>> Imagine using gremlin_python that will compile to Gremlin-Groovy for
>>> execution at GremlinServer.
>>>> 
>>>>      g.V().out(“knows”)[0:2].name.map(f(“{ it.length }”))
>>>> 
>>>> Next, imagine you are in Gremlin-Java and want to submit a traversal to
>>> GremlinServer, but it has a lambda. No worries, just use the
>>> GroovyTranslator and you have:
>>>> 
>>>>      g.V().out(“knows”).limit(2).values(“name”).map(f(“{ it.length
>> }”))
>>>> 
>>>> We could also have:
>>>> 
>>>>      S.s = supplier
>>>>      S.c = consumer
>>>>      S.f = function
>>>>      S.o = operator
>>>> 
>>>> This gets to the general problem of being able to translate lambdas
>>> between different languages as well as being able to send lambdas over
>> the
>>> wire.
>>>> 
>>>> Thoughts?,
>>>> Marko.
>>>> 
>>>> http://markorodriguez.com <http://markorodriguez.com/>
>>>> 
>>>> 
>>>> 
>>> 
>>> 
>> 

Reply via email to