Hi Hannes, On Mon, Feb 27, 2017 at 10:58 AM, H. Hirzel <[email protected]> wrote:
> On 2/27/17, DavidLeibs <[email protected]> wrote: > > I realize this is a few years old but I wanted to give an update on my > > quest > > for quasi-literals. I did a complete quasi-literal framework for Java > when > > I moved over to Oracle Labs. It used the annotation compiler + a few > > tweeks > > to the scanner and parser. You could extend the name space of the > > quasi-literal and have inline SQL or APL. All the parsing, validation, > and > > code rewriting happened at compile time. We proposed it to the Java > Product > > guys and got ignored to death. > > > > As to the characters I did backquote for simple quasi-literal Strings and > > used Oxford Brackets for the quasi-literals with a language namespace. <| > > ...|>. Back quote can be hard to see but is nice for String substitute. > > > > At this point in time the language that does it most right is JavaScript. > > Thanks Mark Miller for all the hard work over the years! > > Thanks David for following up this discussion. > > I wonder if just going for JavaScript ES6 solution (back-ticks) would > be the most straightforward thing to do? > I did a quick hack in Squeak but didn't have time to finish is. I wrote some tests. Complex cases worked, small tricky cases broke the scanner. MCHttpRepository location: 'http://source.squeak.org/inbox' user: '' password: '' Compiler.quasiliteral-eem.280 [Derived from Compiler-nice.279, and renamed from the bogusly named Compiler.quasiquote-eem.248] Add a quasi-literal form for "string interpolation", that allows convenient embedding of expressions within a format string, and provides a convenient way of embedding literal strings within an alternative literal string syntax whose string delimiter is different. e.g. `hello [#cruel] world!` evaluates to 'hello cruel world'. `S1[B1]...SN[BN]SN+1` is equivalent to { 'S1'. [B1] value. ... 'SN'. [BN] value. 'SN+1' } concatenateQuasiLiteral where concatenateQuasiLiteral sends asString to each element and answers the concatenation of those elements. however, single-statement blocks are inlined, so e.g. the above `hello [#cruel] world!` is compiled as { 'hello '. #cruel. ' world!' } concatenateQuasiLiteral See e.g. Tests.quasiliteral-eem.296 for tests and examples. Tests.quasiliteral-eem.296 Renamed from the bogus quasiquote to quasiliteral. Added Balazs' errors as failing tests. > --Hannes > > > https://developer.mozilla.org/en/docs/Web/JavaScript/ > Reference/Template_literals > > Syntax > ---------- > > `string text` > > `string text line 1 > string text line 2` > > `string text ${expression} string text` > > tag `string text ${expression} string text` > > > Description > ---------------- > > Template literals are enclosed by the back-tick (` `) (grave accent) > character instead of double or single quotes. Template literals can > contain place holders. These are indicated by the Dollar sign and > curly braces (${expression}). The expressions in the place holders and > the text between them get passed to a function. The default function > just concatenates the parts into a single string. If there is an > expression preceding the template literal (tag here), the template > string is called "tagged template literal". In that case, the tag > expression (usually a function) gets called with the processed > template literal, which you can then manipulate before outputting. To > escape a back-tick in a template literal, put a backslash \ before the > back-tick. > > -- _,,,^..^,,,_ best, Eliot
