2013-04-30 48 views
0

我希望能够使用MoonScript来制作ComputerCraft的程序,但由于CC被沙箱化以防止Minecraft服务器等的安全问题,我不能要求moonscript直接并从那里运行moonscript代码。我必须将我的moonscript代码转换成lua。moonscript类的Lua输出是MASSIVE

然而,这是有问题的,因为moonscript的类实现是非常大的,而不是很文件化 - 保守。当我键入“类培根”,它输出本作卢阿:

local Bacon 
do 
    local _parent_0 = nil 
    local _base_0 = { } 
    _base_0.__index = _base_0 
    if _parent_0 then 
    setmetatable(_base_0, _parent_0.__base) 
    end 
    local _class_0 = setmetatable({ 
    __init = function(self, ...) 
     if _parent_0 then 
     return _parent_0.__init(self, ...) 
     end 
    end, 
    __base = _base_0, 
    __name = "Bacon", 
    __parent = _parent_0 
    }, { 
    __index = function(cls, name) 
     local val = rawget(_base_0, name) 
     if val == nil and _parent_0 then 
     return _parent_0[name] 
     else 
     return val 
     end 
    end, 
    __call = function(cls, ...) 
     local _self_0 = setmetatable({}, _base_0) 
     cls.__init(_self_0, ...) 
     return _self_0 
    end 
    }) 
    _base_0.__class = _class_0 
    if _parent_0 and _parent_0.__inherited then 
    _parent_0.__inherited(_parent_0, _class_0) 
    end 
    Bacon = _class_0 
    return _class_0 
end 

这是类的实现,这是一种荒谬的。有什么办法可以在我的moonscript代码中缩短这个吗?

+2

你为什么要担心Lua代码的大小?为什么不简单地复制粘贴长代码? ComputerCraft对程序大小有限制吗? – 2013-04-30 14:07:22

+1

这根本不是“大规模”。如果你真的担心它,也许你可以尝试删除空格。和Egor说的一样,文件大小在几乎所有的事情上都是不相关的。 – ECrownofFire 2013-04-30 18:06:50

回答

1

只要看看我的代码可以消除由于_parent_0是零一些死的路径...

local Bacon 
do 
    local _base_0 = { } 
    _base_0.__index = _base_0 
    local _class_0 = setmetatable({ 
    __init = function(self, ...) 
    end, 
    __base = _base_0, 
    __name = "Bacon", 
    }, { 
    __index = function(cls, name) 
     return rawget(_base_0, name) 
    end, 
    __call = function(cls, ...) 
     local _self_0 = setmetatable({}, _base_0) 
     cls.__init(_self_0, ...) 
     return _self_0 
    end 
    }) 
    _base_0.__class = _class_0 
    Bacon = _class_0 
    return _class_0 
end 

你可以找到一个静态的分析来为你做这个。

否则,如果它是纯粹的代码尺寸(以字节为单位)涉及您,然后用压缩机(如Squish

7

的生成代码量已经清理了在最新版本不少,0.2.4 :http://leafo.net/posts/moonscript_v024.html#code_generation_changes

类微创现在看起来像这样

local Hello 
do 
    local _base_0 = { } 
    _base_0.__index = _base_0 
    local _class_0 = setmetatable({ 
    __init = function() end, 
    __base = _base_0, 
    __name = "Hello" 
    }, { 
    __index = _base_0, 
    __call = function(cls, ...) 
     local _self_0 = setmetatable({}, _base_0) 
     cls.__init(_self_0, ...) 
     return _self_0 
    end 
    }) 
    _base_0.__class = _class_0 
    Hello = _class_0 
end 
0

没有办法,你可以在你的moonscript代码缩短这个。但是,您可能能够手动后处理输出,而不是轻微地重构公共部分。值得这样做吗?试想一下:

  • 如果你想使用“类”的概念,因为它是在moonscript可用,那么你必须反正代码的所有这些步骤(否则你会得到一个“类”不同的“类”行为)。
  • 不同的是,在moonscript中,N个类会导致您发布代码的N个副本,每个副本只有两行不同,而如果您手动实现了moonscript的类概念,则可能会使用函数来定义类在一些Lua OO库中完成:Bacon = newClass(“Bacon”)会调用上面的代码,适当地替换“__name =”和“Bacon =”行。
  • 因此,通过手动复制moonscript代码而不是代码,每个类需要20行代码(最新的moonscript)。但是除非你的课程是微不足道的,否则它们可能会包含比20行更多的代码,大概200个代码。
  • 因此,尽管每个班级重复18行,但这可能还不到10%的代码,你将不得不写。
  • 但这是一个假设。如果假设是错误的,那么问题是,为什么你需要在第一个地方上课?只需使用基于带有':'糖的表的基本Lua对象。

如果你真的想使用moonscript输出,我认为你唯一的选择是手动重构它。您发布的代码可以放入函数中,只需要将两行更改为类名的参数化。

请注意,在您的Lua文件中留下由moonscript生成的Lua代码重复,至少对于经常使用的操作(类定义可能不是其中之一,但moonscript比这更多):

  • 它削减函数调用;这可能会提高速度,因为不需要将变量压入堆栈,调用函数,将返回值放入堆栈,读取堆栈,弹出堆栈值)。速度增加是否显着取决于代码被调用的频率。
  • 它更易于维护:如果操作正确,当moonscript更容易更新时,您可能会更新代码。