I'm working on incorporating quasis into the ES6 draft and there is an issue I 
want to discuss:

In the wiki proposal[1]  $  is used as the prefix for substitutions that may be 
of two forms:
   `xyz$foo 1234`      //$foo substitues the value of the variable foo
   `xyz${foo} 1234`    ${expr} generally substitues the result of evaluating 
expr, so ${foo} substitutes the value of foo

Both of the above examples will produce the same result.

The wiki grammar has this production for dealing with $:

   LiteralCharacter :: $ [lookahead ∉ {, IdentifierStart ]

In other words, a $ is a literal part of the quasi text if it that is not 
immediately followed by a { or an IdentifierStart character. 

IdentifierStart includes lots of different things including $  itself and many 
non-roman characters.

For example, under these rules can you (our human readers) identify which of 
the following is intended to be literal text and which contains a variable 
substitution:
   `I say: $ᐭ`     // ᐭ is U+142B
   `I say: $⏅`     // ⏅ is U+23C5

Or, perhaps more routinely:

   `$1234`   // this is all literal text
   `$$1234`  //this is a substitution for the variable $1234

I can think of two alternative way to eliminate these potentially confusing 
situations:

1)  Eliminate the literal use of $ entirely.  The valid uses then are either 
${expr} or $IndentifierName.  Any other occurrence of $ within the literal part 
of a Quasi would have to be escaped.  eg:
     `$99.95`   //syntax error
     `\$99.95`   // same as: "$99.95"

2) Eliminate the $IdentifierName form entirely.  Use ${IdentifierName} instead. 
 Any occurrence of $ not followed by { is a literal $.   eg:
    `$99.95`   // same as: "$99.95"
    `$$1234`  //same as "$$1234"
    `$foo`        //same as "$foo"
    `${foo}`     //substitutes the value of the variable foo
    `${`            //syntax error

Of these two alternatives,  I favor the second over the first and over the 
current wiki specification.  I think alternative 2 makes the overall  language 
simpler for users to learn and to read as it has only one clearly delimitated 
form of substitution.  It eliminates the need to learn and recognize two 
different forms and the possibility of confusion when non ascii characters are 
being used.  It also allows $ to be used literally, which I suspect is quite 
common in some locales. This alternative also is simpler to specify and 
requires fewer parsing irregularities.

There are a couple down sides I see for alternative 2, relative to alternative 
one.  It means that the most common form for substitution expression ( a single 
identifier) requires two more characters.  It also may cause some confusion for 
people who are used to languages that support $identifier substitution syntax 
in strings.   Personally, I think the advantages of this approach out weight 
these disadvantages. Other my disagree.

So, I propose that we go with alternative 2.  Thoughts?

Allen

[1] http://wiki.ecmascript.org/doku.php?id=harmony:quasis#literalportion 
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to