gpt4 book ai didi

macros - 如何在 Haxe 宏函数中声明实例化

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

我想创建一个为我生成此代码的宏:

if (myEntity.get(Attack) == null) myEntity.add(new Attack());
if (myEntity.get(Confused) == null) myEntity.add(new Confused());
if (myEntity.get(Defend) == null) myEntity.add(new Defend());
if (myEntity.get(Offense) == null) myEntity.add(new Offense());

在代码中,我想像这样声明/使用它:
EntityMacroUtils.addComponents(myEntity, Attack, Confused, Defend, Offense);

当前的宏函数如下所示:
macro public static function addComponents(entity:ExprOf<Entity>, components:Array<ExprOf<Class<Component>>>):Expr
{
var exprs:Array<Expr> = [];
for (componentClass in components)
{
var instance = macro $e { new $componentClass() }; // problem is here
var expr = macro if ($entity.get($componentClass) == null) $entity.add(instance);
exprs.push(expr);
}
return macro $b{ exprs };
}

这个宏函数不正确,我得到错误:

EntityMacroUtils.hx:17: characters 22-43 : Type not found : $componentClass



问题是我不知道如何定义 new $componentClass() .我将如何解决这个问题?

我也想避免有 Type.createInstance在输出代码中。

最佳答案

以编程方式生成实例化代码的一种方法是使用“老派”枚举 AST 构建(兼容 Haxe 3.0.1+):

// new pack.age.TheClass()
return {
expr:ENew({name:"TheClass", pack:["pack", "age"], params:[]}, []),
pos:Context.currentPos()
};

使用具体化的改进语法是可能的:
// new pack.age.TheClass()
var typePath = { name:"TheClass", pack:["pack", "age"], params:[] };
return macro new $typePath();

现在,为了方便的“实例化助手”函数语法,我们需要做一些扭曲以从我们在宏函数中收到的表达式中提取类型路径:
// new Foo(), new pack.Bar(), new pack.age.Baz()
instantiate(Foo, pack.Bar, pack.age.Baz);

macro static function instantiate(list:Array<Expr>)
{
var news = [for (what in list) {
var tp = makeTypePath(what);
macro new $tp();
}];
return macro $b{news};
}

#if macro
static function makeTypePath(of:Expr, ?path:Array<String>):TypePath
{
switch (of.expr)
{
case EConst(CIdent(name)):
if (path != null) {
path.unshift(name);
name = path.pop();
}
else path = [];
return { name:name, pack:path, params:[] };

case EField(e, field):
if (path == null) path = [field];
else path.unshift(field);
return makeTypePath(e, path);

default:
throw "nope";
}
}
#end

关于macros - 如何在 Haxe 宏函数中声明实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32179173/

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