【问题标题】:Detect target language in Haxe在 Haxe 中检测目标语言
【发布时间】:2012-07-20 03:18:05
【问题描述】:

我想检测 Haxe 中的目标语言,以便我可以根据 Haxe 编译成的语言更改函数的行为。

类似 Haxe 的伪代码示例:

class Test() {
static function printStuff(toPrint) {
    if (the target language is Java) {
        System.out.println(toPrint);
    } else if (the target language is C++) {
        cout << toPrint;
    } else if (the target language is JavaScript) {
        alert(toPrint);
    }

}
}

目前是否可以在 Haxe 中实现这一点?

【问题讨论】:

    标签: java javascript c++ haxe


    【解决方案1】:

    您可以使用conditional compilationHaxe Magic 来实现此目的。例如:

    #if java
        untyped __java__("java.lang.System.out.println(toPrint);");
    #elseif js
        untyped __js__("alert(toPrint);");
    #elseif ...
        ...
    #end
    

    【讨论】:

    • 这看起来很有趣。我已经开始学习 Haxe 编程语言了。
    • 任何 Haxe 编译器后端都应该支持它。每个后端都可以决定使用什么宏进行条件编译;它不是由 Haxe 语言本身指定的。例如,C++ 可能使用cpp,但它也可以使用cplusplus。为 Haxe 提供 C++ 后端的项目可供选择。
    • 那么您如何将我的伪代码示例转换为真正的 Haxe 代码?
    • 嗯......他们在我的回答中做了什么?
    • :) 请注意,我省略了 C++ 部分,因为我不确定在编译为 C++ 时定义了什么宏,因为据我所知,C++ 不是官方支持的语言。所以……“本节留给读者作为练习。”
    【解决方案2】:

    或者甚至只是使用跟踪。

    class Test()
    {
       static function main()
       {
           #if java
               var language = 'java';
            #elseif js
                var language = 'js';
            #elseif cs
                var language = 'csharp';
            #elseif php
                var language = 'PHP'
            #elseif (flash||flash8)
                var language = 'flash';
            #elseif cpp
                var language = 'c++';
            #elseif neko
                var language = 'neko';
            #elseif tamarin
                var language = 'tamarin';
            #end
            trace( language );
        }   
    }
    

    但应该注意的是,用于编译它的 hxml 需要在理论上指定每个目标,这将是通用的...

    -java java
    -main Test
    --next
    -js test.js
    -main Test
    --next
    -cs cs
    -main Test
    --next
    -php www
    -main Test
    --next
    -swf test8.swf
    -swf-version 8
    -main Test
    --next
    -swf test.swf
    -swf-version 9
    -main Test
    --next
    -neko neko
    --main Test
    

    但实际上,您可能希望添加其他编译器标志,甚至使用 -cmd 来实际运行示例。

    从一系列目标开始...

    'http://haxe.org/doc/start/

    条件编译

    'http://haxe.org/ref/conditionals

    编译器标志和选项,虽然我可能错过了链接。

    'http://haxe.org/manual/tips_and_tricks 'http://haxe.org/doc/compiler

    然后瞄准魔法

    'http://haxe.org/doc/advanced/magic

    对于每个目标,您可以使用通用 haxe api 以及以目标命名的目标特定库

    'http://haxe.org/api

    我对 Stackoverflow 的第一次回复很抱歉,如果它有点冗长:) 也是我无法发布正确链接的原因(仅限于两个)。

    【讨论】:

      【解决方案3】:

      对不起,为什么你显示的是未键入的方式?

      你可以有一个完全键入和自动完成的代码

      class Test() {
          static function printStuff(toPrint) {
              #if java
                  java.lang.System.out.println(toPrint);
              #elseif js
                  js.Lib.alert(toPrint);
              #elseif cpp
                  cpp.Lib.print(toPrint);
              #end
          }
      }
      

      【讨论】:

      • 为什么不简单地使用适用于所有目标语言的 trace(toPrint)?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多