lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


On Tue, Apr 7, 2015 at 11:06 PM, Andrew Starks <andrew.starks@trms.com> wrote:
>
>
> On Tuesday, April 7, 2015, Sean Conner <sean@conman.org> wrote:
>>
>> It was thus said that the Great Daurnimator once stated:
>> > On 8 April 2015 at 10:12, Hisham <h@hisham.hm> wrote:
>> > > Ah! NO LPEG ALLOWED! :)
>> >
>> > Why not?
>>
>>   Way too easy.
>>
>>         lpeg = require "lpeg"
>>         id = lpeg.R("AZ","az","09","__")^1 / variables
>>         expand_variables = lpeg.Cs((
>>                    (lpeg.P"${") / "" * id * (lpeg.P"}"/"")
>>                  + (lpeg.P"$")  / "" * id
>>                  + lpeg.C(lpeg.P(1))
>>                )^0)
>>
>>   -spc (Could be made even smaller ... )
>>
>>
>
> Right. Too easy and too readable. :)
>
> -Andrew

That's your idea of readable? Yikes.

Maybe not shortest, but somewhat clear solution:
local vars = setmetatable({foo="bar"}, {
    __index = function(self, k)
        return type(k) == 'string' and rawget(self, k:match('{?([%w_]+)}?'))
    end,
})
function expand_variables(str)
    return str:gsub('%$(%S+)', vars)
end

-- 
Sent from my Game Boy.