【问题标题】:CFor in Haxe using MacrosCFor 在 Haxe 中使用宏
【发布时间】:2013-12-31 15:31:01
【问题描述】:

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

我试图在 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);
            });     
    }

}

问题:

  • 它已经可以工作了(那个特定的测试),但它与传统的 for 循环并没有那么接近。 如何改进?
  • 您对此代码有任何其他改进(样式/功能)吗?
  • 关于此代码,我应该了解什么特定的目标吗?
  • 如何查看对 cfor 的调用扩展为什么?

【问题讨论】:

  • 您可以在其他类中执行import CFor.cfor,然后只需运行cfor(cond),而无需调用CFor.cfor(),这有点帮助。 @Franco 在下面显示的答案是一种让它看起来更像经典 C 外观的方法
  • 要查看生成的代码,请使用haxe -D dump=pretty mybuild.hxml。它将创建一个“dump/”文件夹,其中包含“CFor.dump”,显示生成的代码。
  • 那个倾倒很整洁,谢谢。我之前做的就是编译成Java,看输出,但显然这不是一个好的选择。
  • 直到昨天我做了同样的事情,我才在看到你的问题前几个小时才发现“-D dump=pretty”选项:)

标签: for-loop macros haxe


【解决方案1】:

这个怎么样?

https://gist.github.com/dpeek/7476625

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

我没有看到您的代码有任何潜在的目标特定问题。

【讨论】:

  • 这也是一件非常有趣的事情,虽然我想避开构建宏......据我了解,这段代码循环了所有可能比标准宏花费更长的表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多