Вызов статических функций Lua из кода Haxe - PullRequest
0 голосов
/ 02 января 2019

Краткая версия

Как мне написать код 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);
}

1 Ответ

0 голосов
/ 02 января 2019

Действительно, вы можете сделать это с помощью @:luaDotMethod метаданных на extern.From haxe --help-metas:

Указывает, что данный экземпляр типа extern должен иметь вызов в стиле точки для методов вместо двоеточия.

Вот пример:

class Main {
    public static function main() {
        Love.graphics.setColor(0, 0, 0);
    }
}

@:native("love")
extern class Love {
    static var graphics(default, null):Graphics;
}

@:luaDotMethod
extern class Graphics {
    function setColor(r:Int, g:Int, b:Int):Void;
}

Это генерирует следующий код Lua:

Main.main = function() 
  love.graphics.setColor(0, 0, 0);
end

В качестве альтернативы, вы можете сделать то же самое, объявив setColor() как функцию static, что может быть более естественным изПерспектива Haxe:

class Main {
    public static function main() {
        love.Graphics.setColor(0, 0, 0);
    }
}
package love;

@:native("love.graphics")
extern class Graphics {
    static function setColor(r:Int, g:Int, b:Int):Void;
}

Кстати, на Haxelib уже есть библиотека с внешними компонентами Love2D под названием hx-love2d .Не уверен, насколько он обновлен или завершен.Здесь setColor() представляется как GraphicsModule.setColor() (в пакете love.graphics).

...