Hi Alexander, I have run into this myself. It is a real problem, and I like the nature of your proposed solution. But I don't understand how it might break the web. If Symbol.templateTag is a new symbol, guaranteed unequal to any prior value, how can introducing it, and new behavior conditional on it, change any existing behavior?
On Wed, Nov 16, 2016 at 5:02 PM, Alexander Jones <a...@weej.com> wrote: > Hi es-discuss! > > Template tags are a great feature with many novel applications, IMO > approaching macro-level expressiveness. But due to their nature in this > context, it's helpful if tags are named quite tersely. Unfortunately, if > you have existing API, this can be challenging. > > Let's say I have a DSL (domain-specific language), and I *may*, unsafely, > generate typed snippets of code containing that DSL like so: > > ```js > function dsl(code: string) { > // `code` MUST be well-formed > } > > const someStatement = dsl("val foo = " + dslEncode(foo)); > ``` > > Let's say I'd like to add support in my library for ES6 clients such that > they can do: > > ```js > const someStatement = dsl`val foo = ${foo}`; > ``` > > where the `dsl` template tag would be implemented such that `dslEncode` is > used on each interpolated expression. > > Unfortunately, the `dsl` function's arguments are already defined and > can't be changed. I'd need a new name, like `dsl.tag`, which would end up > being a fair bit more verbose. > > Would it be possible, at this point, to introduce a new behaviour into ES > such that instead of merely calling the tag object, the implementation > first checks for a `Symbol.templateTag` property on the tag object, and if > it exists, it is invoked? I'd guess this can't Break The Web because no-one > can realistically be using an existing function as a template tag if it was > not already designed for it. > > ```js > const someStatement = dsl`val foo = ${foo}`; > // desugars to, approximately > const someStatement = (dsl[Symbol.templateTag] || dsl)(["val foo =", ""], > foo); > ``` > > To be honest, I am kind of surprised it wasn't already implemented like > this, but maybe there were performance concerns with the branching. > Interested in your thoughts. > > Thanks > > Alex > > _______________________________________________ > es-discuss mailing list > es-discuss@mozilla.org > https://mail.mozilla.org/listinfo/es-discuss > > -- Cheers, --MarkM
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss