Embedded expressions in string literals.

Schulz, Stefan schulz at e-Spirit.de
Thu Mar 19 01:00:17 PDT 2009


The proposal I set up only provides some syntax sugar for embedding expressions in Strings. It's not about deferring expression evaluation or late binding. Although, this might be  desireable, it is better to be solved by a proper closure solution, which obviously is out of scope for Coin.

Stefan

> -----Original Message-----
> From: coin-dev-bounces at openjdk.java.net 
> [mailto:coin-dev-bounces at openjdk.java.net] On Behalf Of 
> rssh at gradsoft.com.ua
> Sent: Wednesday, March 18, 2009 9:52 PM
> To: Howard Lovatt
> Cc: coin-dev
> Subject: Re: Embedded expressions in string literals.
> 
> > I don't see your binding proposal as an improvement over 
> what we have
> > got for many use cases, that is not to say that it isn't valuable as
> > an API. It is an API for string processing and therefore should be a
> > suggested library change; not part of coin. The string literals with
> > expressions and your API proposal would be complementary, 
> particularly
> > if they had similar syntax. Also see a formal proposal for embedding
> > expressions into strings on coin, it is called Proposal: Embedded
> > Expressions for String Statements and is from Stefan Schulz.
> >
> 
> For implementing such proposal you need a mapping between 
> names and values.
> (I. e. our binding).
> 
> Now, let's think about all entities, which we have:
> 
> 1. binding.
> 2. String before process of substituting embedding expression.
> 3. Process of substituting embedding expression. (I. e. syntax of
> mini=language inside string).
> 
> Applying this 3 entities we receive:
> 
> 4. String after process of substituting embedding expression.
> 
>  Original Stefan proposal does not specify difference between 2 and 4.
> Problem, that
>   if (2) exists only in program text (and transformed to 4 during
> compilation process), than
>     - such transformation is possible only in static context, fixed in
> compile-time. This means that you can't pass such string literal to
> arguments, and, for example, next code snipset:
> 
> int x = readX();
> System.out.println("You entered \{x}");
> 
> Will produce result differ, than
> 
> String message = "You entered \{x}";
> int x = readX();
> System.out.println(message);
> 
> I belive, that fixing all such transformations in static context is
> fundamentally wrong.
> 
> Ok, now let's interpret Stefan proposal (EESL) in dynamic context.
> But for this we need specify binging (explicit or implicit [in static
> context ?]) and mark process of interpretation by some function. I. e.
> receive all the complexity of embedding interpreted language. 
> Fortunelly,
> this complexity already implemented in JSR223 interface. Embedded
> expressions proposal in such interpretation - just yet one syntax for
> embedded language. (We already have near 200 JVM languages, 
> most of them
> implement javax.scripting interfaces)
>  Of course, we can choose language of some simple syntax be 
> default for
> string expression processing - in such case, binding will 
> just a mechanism
> for implementation of EESL.
> 
> 
> > 2009/3/19  <rssh at gradsoft.com.ua>:
> >>> Hi All,
> >>>
> >>> 2009/3/18  <rssh at gradsoft.com.ua>:
> >>>
> >>> [snip]
> >>>
> >>>> Complex case:
> >>>> Create special syntax for template processing inside 
> strings - I guess
> >>>> this can be a library issue.
> >>>> We have jsr223. May be good ideaa is adding helper methods, which
> >>>> process
> >>>> string via choosed language interptreter, i.e.
> >>>> =s.scriptEval("velocity",binding);
> >>>> =.... but - from other side =we can't receive binding 
> between names
> >>>> and
> >>>> values automatically for now.
> >>>
> >>> Not sure that a library would work, can you give an example of the
> >>> call you propose?
> >>>
> >>
> >> Example of such call can be:
> >>
> >> binding = new Binding();
> >> binding.put("x",x);
> >> binding.put("y",y);
> >>
> >> """
> >>  <?if ($x==$y) {?>
> >>   A
> >>  <? } else { ?>
> >>   B
> >>  <? } ?>
> >> """.evalScript("PHP",binding);
> >>
> >> If PHP is avaible via JSR223 API, then string will be 
> evaluated to A or
> >> B.
> >> Or, if you does not like PHP, you can use velocity or java.
> >>
> >> But creating binding by hands (first 3 strings of test) kill all :(
> >>
> >> From other side, in principle compiler can generate 
> binding for local
> >> variables automatically, so in principle it is possible to 
> create 'magic
> >> annotation', to write code like:
> >>
> >>
> >> int someMethod();
> >> {
> >> int x=1;
> >> int y=2;
> >> @GenerateVariableBinding
> >> Binding binding;
> >>
> >> String s = """
> >>  <?if ($x==$y) {?>
> >>   A
> >>  <? } else { ?>
> >>   B
> >>  <? } ?>
> >> """.evalScript("PHP",binding);
> >>
> >> System.out.println();
> >>
> >> }
> >>
> >>
> >> (I think about formalizing and submitting such proposal, 
> but not sure
> >> that
> >> it is possible correct define one in short terms.)
> >>
> >>
> >>
> >>
> >>
> >> 
> ______________________________________________________________________
> >> This email has been scanned by the MessageLabs Email 
> Security System.
> >> For more information please visit http://www.messagelabs.com/email
> >> 
> ______________________________________________________________________
> >>
> >
> 
> 
> 
> 



More information about the coin-dev mailing list