2013-04-30 2 views
0

Я хотел был бы иметь возможность сделать программу для ComputerCraft с использованием MoonScript, но из-за того, что CC изолирован для предотвращения проблем безопасности на серверах Minecraft и т. Д., Я не могу требовать moonscript непосредственно и запустить код moonscript оттуда. Я должен преобразовать свой код moonscript в lua.Lua output для классов moonscript MASSIVE

Это проблематично, однако, из-за того, что реализация класса для moonscript очень велика и не очень консервативна для файлов. Когда я типа «класса Бекон», он выдает это за Lua:

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? –

+1

Это совсем не «МАССИВ». Если вы действительно беспокоитесь об этом, возможно, вы можете попробовать удалить пробелы. И, как сказал Егор, размер файла практически не имеет значения. – ECrownofFire

ответ

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 будет обновляться более легко.