One thought, I had to share after laying it on dherman in person: We sure could use a pure-JS implementation of the proposal, on github, so people can *use* it. A lot of the arguments here should be settled by beating on the anvil of an open-source, forkable implementation, and may the sharpest fork, er, sword, win.
I'd hate to be on a committee that had to pick the winner prematurely, or really, without user testing and feedback -- and yes, even forking that led to greater user testing and eventual consolidation. Separately I think TC39 does agree that injection-attack safety is a goal, and for this reason quasis are still on our agenda. Can we combine forces or at least make proposals combine well? /be On Mar 9, 2011, at 3:35 PM, Shanjian Li wrote: > That part is for sure, ie. we won't have gratuitously different pattern > formats and styles of operation. As to how the internationalized one will be > designed and implemented, two possibilities. > 1. I18n feature (locale specific behavior) will be implemented through extend > the existing mechanism (like bob's idea, to pass formatting responsibility to > object's toFormat() method). > 2. I18n feature will be implemented on top of the generic form, using it as a > foundation. > > shanjian > > On Wed, Mar 9, 2011 at 3:14 PM, Gillam, Richard <gil...@lab126.com> wrote: > If we're going to ultimately have two APIs that do the same thing-- a generic > one and an internationalized one-- can we at least avoid having them have > gratuitously different pattern formats and styles of operation? > > --Rich Gillam > Lab126 > > On Mar 9, 2011, at 3:01 PM, Nebojša Ćirić wrote: > >> This proposal intentionally avoids i18n issues and focuses on general >> formatting. One can still use i18n features from our API like so: >> >> var locale = new LocaleInfo(); >> var df = locale.dateTimeFormat(); >> >> "I got married on {0}".format(df.("12/03/2001")); >> >> MessageFormat was focusing on plurals and gender, and we couldn't reach >> consensus on actual message format and scope, so we postponed it. Also, we >> aim to avoid adding i18n API objects into core language at this moment. >> >> 09. март 2011. 14.53, Shawn Steele <shawn.ste...@microsoft.com> је >> написао/ла: >> I would postpone any formatting stuff until the i18n stuff was better >> understood. >> >> >> - Shawn >> >> >> http://blogs.msdn.com/shawnste >> >> >> -----Original Message----- >> From: es-discuss-boun...@mozilla.org [mailto:es-discuss-boun...@mozilla.org] >> On Behalf Of Gillam, Richard >> Sent: Wednesday, March 09, 2011 2:46 PM >> To: es-discuss@mozilla.org >> Subject: Re: A proposal to add String.prototype.format >> >> It seems worth mentioning that this functionality sounds an awful lot like >> what MessageFormat does, and MessageFormat was in the i18n strawman (and I >> have it in my own i18n implementation). It doesn't seem like we need two >> different "formatted string" APIs. >> >> --Rich Gillam >> Lab126 >> >> On Mar 9, 2011, at 2:36 PM, Adam Shannon wrote: >> >> > I rather like the idea of having this syntax for string formatting: >> > >> > "name: {name:first} {name.last}".format(name) >> > >> > It allows for more complex operations >> > >> > "name: {person.firstName} \nstart: >> > {myEvent.startTime}".format(myEvent, person) >> > >> > Also, it doesn't require mundane fixes later on and keeps things >> > simple for the developer. (No needed knowledge or maintenance of >> > things based on position.) >> > >> > On Wed, Mar 9, 2011 at 15:36, Shanjian Li <shanj...@google.com> wrote: >> >> I like this idea. I thought a lot about how to support those locale >> >> specific stuff like plural and gender. Your suggestion provide an >> >> elegant way to transfer the responsibility to a more appropriate party. >> >> >> >> shanjian >> >> >> >> On Wed, Mar 9, 2011 at 1:18 PM, Bob Nystrom <rnyst...@google.com> wrote: >> >>>>> >> >>>>> It doesn't specify how to print objects, except for %s, which says >> >>>>> that if the argument is not a string, convert it to string using >> >>>>> .toString(). >> >>>> >> >>>> If the format specifier does not apply to the argument given, it >> >>>> should raise exceptions. Except string conversion, no other >> >>>> conversion will be done. >> >>> >> >>> I like your first six points, but the formatting string stuff feels >> >>> odd to >> >>> me: neither dynamic nor object-oriented. C needs format specifiers >> >>> because it doesn't otherwise know now to interpret the bits you >> >>> give. ES doesn't have that problem. >> >>> At the same time, baking a rigid set of formatting instructions into >> >>> string.format() feels like a poor separation of concerns. >> >>> string.format()'s just is to compose a string out of smaller pieces. >> >>> Why should it need to know anything about numbers or dates? >> >>> Could we just say that this: >> >>> "hi, {0:blah}.".format(someObj); Is (conceptually) desugared to: >> >>> ("hi, " + someObj.toFormat("blah") + ".") So anything after the >> >>> ":" in an argument (the format string) gets passed to the object >> >>> itself by way of a call to toFormat() (or some other method >> >>> name) on it. Then each object can decide what format strings are >> >>> appropriate for it. >> >>> This keeps the responsibilities separate: string.format() does >> >>> composition, and the composed object own their own formatting. It's >> >>> also >> >>> extensible: you can define your own formatting capabilities for your >> >>> types and use them with string.format() by defining toFormat(). (By >> >>> default, I would assume that Object.prototype.toFormat() just calls >> >>> toString()). >> >>> This, I think, helps with locale issues too. Types like Date that >> >>> care about locale will be able to handle it themselves in their call >> >>> to >> >>> toFormat() without string.format() needing to deal with it. >> >>> - bob >> >>> >> >>>> >> >>>> >> >>>>> >> >>>>> The string conversion should probably use the internal ToString >> >>>>> function instead (which works for null and undefined too). >> >>>> >> >>>> Agree. >> >>>> >> >>>>> >> >>>>> For formats expecting numbers, it should convert the argument to a >> >>>>> number using ToNumber. >> >>>> >> >>>> Probably not. As string is the thing being constructed, it make >> >>>> sense to offer "hidden" string conversion. In my experience using >> >>>> this feature in Python, it is within expectation and offer some >> >>>> convenience. Any further "hidden" conversion should really be avoided. >> >>>> >> >>>>> >> >>>>> Rounding is specified as "math.round(n - 0.5)" (capital M in Math?). >> >>>> >> >>>> Right, thanks. >> >>>> >> >>>>> >> >>>>> This leaves it open whether overwriting Math.round should change >> >>>>> the behavior of format. It probably shouldn't (i.e., again it >> >>>>> would be better to specify in terms of internal, >> >>>>> non-use-modifiable functions). >> >>>> >> >>>> Agree. >> >>>> >> >>>>> >> >>>>> The rounding is equivalent to Math.floor(n) (aka round towards >> >>>>> -Infinity), if I'm not mistaken, so why not just use that? >> >>>> >> >>>> In this example, 8 / (3 - 8 / 3) , the display will be >> >>>> 23.99999999999999. >> >>>> So the internal representation could be a little bit more or a >> >>>> little bit less than the theoretical value due to float precision. >> >>>> Math.round might generate less surprise results than Math.floor. >> >>>> Of cause, the internal implementation shouldn't rely on either of these >> >>>> two. >> >>>> >> >>>>> >> >>>>> (Personally I would prefer truncation (round towards zero), if >> >>>>> conversion to integer is necessary). >> >>>>> >> >>>>> Why can octal, binary and hexidecimal forms only be used on integers? >> >>>>> Number.prototype.toString with >> >>>>> an argument works on fractions too (try Math.PI.toString(13) for >> >>>>> laughs :). >> >>>> >> >>>> >> >>>>> >> >>>>> Why only fixed bases (2,8,10,16)? How about adding an optional >> >>>>> base parameter to number display (with x, d, o, b as shorthands >> >>>>> for the more standard bases)? Again, Number.prototype.toString >> >>>>> means that it's already in the language. (I know that step 7 says >> >>>>> copy the format of other languages, but that seems shortsighted >> >>>>> since ECMAScript is not those languages, and only copying >> >>>>> functionality from C verbatim seems like tying your shoelaces >> >>>>> together before the race). >> >>>>> >> >>>> The question for both questions is how useful is that. If it is >> >>>> only needed in one or few rare occasions, it is probably not a good >> >>>> idea to complicate the language. >> >>>> >> >>>>> >> >>>>> "Placeholder used in format specifier part can not have format >> >>>>> specifier. This prevent the replacement from embedding more than >> >>>>> one level." >> >>>>> Should that be "... can not have a placeholder."? >> >>>> >> >>>> No. The former prevent any format specifier (including embedded >> >>>> placeholder). Refer to the Python specification, it does make sense. >> >>>> >> >>>>> >> >>>>> If the placeholder value is not a string, it should be converted >> >>>>> to a string. >> >>>>> If it is not a valid format, what happens then? >> >>>> >> >>>> Raise exception? >> >>>> >> >>>>> >> >>>>> Is the following valid: >> >>>>> "{x} and {1[y]}".format({x:42},{y:37}) I.e., can object property >> >>>>> shorthands ({x} instead of {0[x]}) be used if there are more than >> >>>>> one argument? >> >>>> >> >>>> Good points. Possible choices: >> >>>> 1. {x} always refer to the first object given. >> >>>> 2. {x} only works when there is one and only one object argument. >> >>>> 3. {x} will be replaced by the first object that has property x, >> >>>> ie. the following should work too. >> >>>> "{x}, {z} and {1[y]}".format({x:42}, {z:43, y:37}) >> >>>> >> >>>> I prefer 1. >> >>>> >> >>>>> >> >>>>> And some arbitrary ideas for extension: >> >>>>> >> >>>>> How about a boolean test that checks for falsy-ness of the >> >>>>> argument and acts as one of two other formats or literals? >> >>>>> E.g. >> >>>>> "{0:s} drew {1:?his|her} gun.".format(person.name, person.isMale) >> >>>>> "Please press return{0:?.|{1}}".format(notCritical, " and run!") >> >>>> >> >>>> Interesting. In example 1, the issue is literal get into the >> >>>> placeholder, that could make things messy. >> >>>> >> >>>>> >> >>>>> Or allow computed indices? >> >>>>> "{0[{1}][he]} drew {0[{1}][his]} >> >>>>> gun.".format({male:{he:"He",his:"his"}, >> >>>>> female:{he:"She",his:"her"}}, "female"); >> >>>> >> >>>> Allow embedded placeholder inside the field part (not the format >> >>>> specifier part) of a placeholder is something that I will be very >> >>>> cautious about. >> >>>> shanjian >> >>>> >> >>>>> >> >>>>> /L >> >>>>> -- >> >>>>> Lasse Reichstein - reichsteinatw...@gmail.com >> >>>> >> >>>> >> >>>> _______________________________________________ >> >>>> es-discuss mailing list >> >>>> es-discuss@mozilla.org >> >>>> https://mail.mozilla.org/listinfo/es-discuss >> >>>> >> >>> >> >> >> >> >> >> _______________________________________________ >> >> es-discuss mailing list >> >> es-discuss@mozilla.org >> >> https://mail.mozilla.org/listinfo/es-discuss >> >> >> >> >> > >> > >> > >> > -- >> > Adam Shannon >> > UNI Freshman >> > Web Developer >> > ashannon.us >> > _______________________________________________ >> > es-discuss mailing list >> > es-discuss@mozilla.org >> > https://mail.mozilla.org/listinfo/es-discuss >> >> _______________________________________________ >> es-discuss mailing list >> es-discuss@mozilla.org >> https://mail.mozilla.org/listinfo/es-discuss >> >> _______________________________________________ >> es-discuss mailing list >> es-discuss@mozilla.org >> https://mail.mozilla.org/listinfo/es-discuss >> >> >> >> -- >> Nebojša Ćirić > > > _______________________________________________ > es-discuss mailing list > es-discuss@mozilla.org > https://mail.mozilla.org/listinfo/es-discuss > > > _______________________________________________ > es-discuss mailing list > es-discuss@mozilla.org > https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss