|
On 26/08/15 04:24 PM, Dirk Laurie wrote:
2015-08-24 18:07 GMT+02:00 steve donovan <steve.j.donovan@gmail.com>:On Fri, Aug 21, 2015 at 4:04 PM, Coda Highland <chighland@gmail.com> wrote:I think C++11's way of defining new literals is pretty reasonable. You define a suffix operator (which must start with _) and when literals appear with that suffix, it's translated at compile time (in Lua's case, bytecode generation time) to a call to that functionBut (and this is crucial) any resulting object creation is not hoisted out. For instance, in languages with regexp literals /.../, the literal is replaced with a reference to a compiled regexp object. They effectively become constants. If I see a 'date literal' like D'2015-08-24' in Lua I know that this string will be parsed _each time_ - it isn't really a literal. Code generation for true custom literals would get pretty involved. I don't think the prettiness is worth the bother.Not at all, assuming that Roberto's suggestion of per-value metatables gets implemented. A user-defined literal would be implemented as a string with a metatable. It could work this way:
I'd rather have multiple levels of metatables. Value level Scope level Function level Module level Global level Including for tables so that you can t = {} t:insert(v) and it just works.
1. (Acting on William Ahern's criticism of my earlier suggestion of angle brackets, which could result in situations where the parser is lead astray) Use an "unexpected symbol" as trigger, say "!". Everything up to the next whitespace character is the literal, say !2015-08-24. 2. Check whether the string value "!2015-08-24" has a metatable. If so, that value is is used. 3. If not, do this before using the value: -- for _,rule in ipairs(user_defined_literals) do local pat,action = next(rule) local result = ("!2015-08-24"):gsub(pat,action) if result then break end end if result then setmetatable("!2015-08-24",result") end --
-- Disclaimer: these emails are public and can be accessed from <TODO: get a non-DHCP IP and put it here>. If you do not agree with this, DO NOT REPLY.