gpt4 book ai didi

types - 在 Haxe 中,如何将类型/类添加到带有宏的模块中?

转载 作者:行者123 更新时间:2023-12-04 17:17:32 25 4
gpt4 key购买 nike

我想根据在目录中找到的一些文件向给定模块动态添加一些新类型。

我实际上是在尝试填充一堆 @:file(...)在模块底部嵌入类。

//This is the module I'm targeting to append embedded ByteArray subtypes (see below)
@:build(macros.AutoEmbed.build("some/folder/"))
class Embeds {
//Empty on purpose, just let the Macro do its thing!
}


// At "macro-time", it should generate these:

@:file("some/folder/ui_main.xml")
class UI_MAIN_XML extends flash.utils.ByteArray { }

@:file("some/folder/config.template.json")
class CONFIG_TEMPLATE_JSON extends flash.utils.ByteArray { }

到目前为止,我发现我可能需要更改 Embeds.hx模块。所以我查看了 Context.getModule( Context.getLocalModule() ) .我还查看了 TypeDefinition因为这似乎是从头开始定义新类型的唯一方法。
Context.getModule(...) 的问题但它返回一个数组 Array<Type> ,而不是 Array<TypeDefinition> ,所以我不能追加新的 TypeDefinition到它(加上我必须弄清楚如何写这些,呃)。这对我来说可能是一个糟糕的假设,但我认为只需附加更多 TypeDefinition为此,我可以在模块中动态提供更多类型。

如您所知,我对宏还是很陌生!

编辑

确实,我可以动态地写入/覆盖一个新的 Embeds.hx在编译时使用 的文件文件系统/文件写入解决方案,但这意味着需要至少编译一次,然后您的 IDE 的自动完成才能获取生成的 Embeds.*类(在我的例子中是 FlashDevelop)。另外,每当新文件被放入定义的文件夹中时,同样的问题:您需要在 IDE 检测到它之前先进行编译。是的,我真的很喜欢自动完成 :)

最佳答案

从构建宏开始是好的。您可以构建类字段并创建类型。

这是一个只生成一种类型和相应字段的宏:

#if macro
import haxe.macro.Context;
import haxe.macro.Expr;

class AutoEmbed
{
macro static public function build(folder:String):Array<Field>
{
var inClass = Context.getLocalClass().get();

// explore folder and create those:

var fileName = 'resource/strings.json';
var name = fileName.split('/').pop().split('.').join('_');

var valueExpr = makeType(inClass.pack, name, fileName);

var field = {
name: name,
access: [APublic, AStatic, AInline],
kind: FVar(null, valueExpr),
pos: Context.currentPos()
}

return [field];
}

static function makeType(pack:Array<String>, name:String, fileName:String)
{
var pos = Context.currentPos();
var className = name.toUpperCase();

var cdef = macro class Tmp extends haxe.io.BytesData { }
cdef.pack = pack.copy();
cdef.name = className;

cdef.meta = [{
name: ':file',
params: [Context.makeExpr(fileName, pos)],
pos: pos
}];

haxe.macro.Context.defineType(cdef);

return {
expr:EConst(CIdent(className)),
pos:pos
};
}
}
#end

现在使用它:
trace(Embed.strings_json); // [ByteArray]

@:build(AutoEmbed.build('some/folder'))
class Embeds
{
// generate field strings_json pointing to class STRINGS_JSON
}

关于types - 在 Haxe 中,如何将类型/类添加到带有宏的模块中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32909150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com