Краткая версия
Как мне написать код Haxe, который будет генерировать код Lua, который выполняет статические вызовы функций вместо использования синтаксиса вызова метода экземпляра?
Длинная версия
У меня есть программа Haxe, которая генерирует код Lua.Я запускаю этот код Lua на LÖVE , где среда выполнения предоставляет различные функции, используя таблицы Lua в качестве пространств имен.Эти функции в основном предназначены для статического вызова, например:
love.graphics.setColor(r, g, b)
К сожалению, генерация кода Lua в Haxe, похоже, предполагает, что все вызовы функций Lua вызывают методы экземпляра, поэтому генерируемый код используетСинтаксис вызова метода Lua, например:
love.graphics:setColor(r, g, b)
Я пробовал разные способы вызова этой функции.Я нашел только один, который работает:
class Love {
static public var graphics: Graphics = new Graphics();
}
class Graphics {
public function new() {}
public function setColor(r: Int, g: Int, b: Int) {
var fn = untyped love.graphics.setColor;
fn(r, g, b);
}
}
Я могу вызвать это в Haxe следующим образом:
Love.graphics.setColor(r, g, b);
Это прекрасно работает, но это не элегантно, так что мне интересно, еслиесть лучший способ сделать это.Я подозреваю, что это может также привести к небольшим потерям производительности, хотя я не особенно обеспокоен этим, и LuaJIT может быть достаточно умным, чтобы в любом случае оптимизировать промежуточную переменную.В основном, я просто хочу более чистый способ написания этого кода-обертки.
Кажется, что внешняя функциональность Haxe могла бы быть ответом здесь, но в настоящее время нет документации, специфичной для Lua, как его использовать, и я не могувыясните, как его применить здесь.
Вот несколько примеров кода, который не работал (они генерировали вызовы метода экземпляра вместо статических вызовов):
public function setColor(r: Int, g: Int, b: Int) {
(untyped love.graphics.setColor)(r, g, b);
}
var _setColor = untyped love.graphics.setColor;
public function setColor(r: Int, g: Int, b: Int) {
_setColor (r, g, b);
}