Proposal: Symbol.templateTag

Mark S. Miller erights at google.com
Thu Nov 17 04:58:29 UTC 2016


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 <alex at 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 at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
>


-- 
    Cheers,
    --MarkM
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20161116/c5878d87/attachment.html>


More information about the es-discuss mailing list