Lua 函数美学2---修饰器

不用括号,使程序多了几分灵性。 如果这不是美,那这个是什么?

依赖 cosmo

function deco(f)
   -- define decorator
    function ff(t)
        if t.content then
            return f(t)
        else
            function g(s)
                t.content=s
                return f(t)
            end
            return g
        end
    end
    return ff
end

-- call decorator
env=deco(function (t)
    s=cosmo.fill([[\\begin{$name}[$option]
        $content
\\end{$name}
    ]], t)
    return s
end)

print(env {name='env',option='option'} 'hello')

或者

-- call decorator
function env(t)
    s=cosmo.fill([[\\begin{$name}[$option]
        $content
\\end{$name}
    ]], t)
    return s
end)
env = deco(env)

又或者

deco {env=function (t)
    s=cosmo.fill([[\\begin{$name}[$option]
        $content
\\end{$name}
    ]], t)
    return s
end,
cmd=function (t)
    s=cosmo.fill([[\\$name[$option]{$content}]], t)
    return s
end
}

print(env {name='env',option='option'} 'hello')
print(cmd {name='cmd',option='option'} 'hello')

更加复杂,动态的;采用工厂模式

function decoFactor(candidate)
    return function (fs)
    for name, func in pairs(fs) do
    function ff(t)
        if t[candidate] then
            return func(t)
        else
            -- currized
            function g(s)
                t[candidate]=s
                return func(t)
            end
            return g
        end
    end
    _ENV[name]=ff
end
end
end

deco = decoFactor 'content'
点赞
horan
horan

cosmo.fill 这个是啥东东,代码没能运行起来

2019-05-06 13:43:28
William Song
William Song

依赖第三方cosmo

2019-05-07 20:07:01