For loop 在Haxe中使用宏的CFor

For loop 在Haxe中使用宏的CFor,for-loop,macros,haxe,For Loop,Macros,Haxe,所以,我喜欢宏(对我大喊大叫) 我试图在Haxe中创建一个宏,它允许我编写传统的(C++,Java)for循环,并具有相同的功能。但是我在Haxe是个初学者 代码: import haxe.macro.Expr; class Cfor { macro public static function cfor(init: Expr, cond: Expr, post: Expr, body: Expr) { return macro { $init

所以,我喜欢宏(对我大喊大叫)

我试图在Haxe中创建一个宏,它允许我编写传统的(C++,Java)for循环,并具有相同的功能。但是我在Haxe是个初学者

代码:

import haxe.macro.Expr;

class Cfor {

    macro public static function cfor(init: Expr, cond: Expr, post: Expr, body: Expr) {
        return macro {
            $init;

            while ($cond) {
                $body;
                $post;
            }
        }
    }

    public static function main() {
            trace("Traced");
            cfor(var i = 0, i < 100, i++, {
                    var x = i * 2;
                    trace(x);
            });     
    }

}
导入haxe.macro.Expr;
类别Cfor{
宏公共静态函数cfor(init:Expr,cond:Expr,post:Expr,body:Expr){
返回宏{
$init;
while($cond){
$body;
$post;
}
}
}
公共静态函数main(){
跟踪(“跟踪”);
cfor(变量i=0,i<100,i++{
var x=i*2;
微量元素(x);
});     
}
}
问题

  • 它已经可以工作了(具体的测试),但是它与传统的for循环没有那么接近如何改进?
  • 您对这段代码还有其他改进(风格/功能)吗
  • 关于这段代码,有什么我应该知道的特定目标吗
  • 我怎样才能看到对cfor的呼叫扩展到了什么
    • 这个怎么样

      方法是不同的(应用于上下文),但我认为它更接近预期的结果


      我看不到您的代码中存在任何潜在的特定于目标的问题。

      您可以在其他类中执行导入CFor.CFor,然后只运行
      CFor(cond)
      ,而不必调用
      CFor.CFor()
      ,这有点帮助@Franco在下面的回答显示了一种使其看起来更像经典C look的方法。要查看生成的代码,请使用
      haxe-D dump=pretty mybuild.hxml
      。它将创建一个带有“CFor.dump”的“dump/”文件夹,其中显示生成的代码。该转储非常整洁,谢谢。我之前做的是编译成Java并查看输出,但显然这不是一个好的选择。直到昨天我做了同样的事情,我在看到您的问题前几个小时才发现“-D dump=pretty”选项:)这也是一件非常有趣的事情,尽管我想远离构建宏。。。据我所知,这段代码循环所有可能比标准宏耗时更长的表达式。