GitHub

Haxe

さまざまな言語にコンパイルできる静的型付け言語Haxe(ヘックス)に関するメモです。

以下はJSにコンパイルすることを想定しています。

リンク

公式

日本語のガイド(神記事)

HaxeのコードをNode.js上で動かすやつ

インストール

Vimプラグイン

テスト

jQuery使いたいんだけど

underscore.hx

特徴

  • 静的型・型推論
  • いろんな言語にコンパイルできる
  • 雰囲気はJavaに似ているが、関数型っぽい書き方もできそう

言語仕様

名前空間

Javaのように冒頭でpackage foo;のように宣言する方式らしい

例:foo/Test.hx

 package foo;
 class Test1 {
   ...

Main.hx

 import foo.Test;  // foo/Test.hxをインポートする
 // Test1 で、foo.Test1にアクセスできる
 // Test内で定義したクラスはぜんぶ見えるようになる。
 // 見せたくないクラスはprivate class Test2 { のようにする

しかし「import foo.Test;」っていう書き方はちょっとキモいなぁ。最後のTestはクラス名のように見えるけど、ファイル名なんだよね。 クラスTestだけをimportしたい場合は「import foo.Test.Test;」みたいに書く。

無名オブジェクト(Anonymous object, Structとも)

http://haxe.org/manual/struct

JavaScriptのオブジェクトリテラル的な。

 var point = { x : 1, y : -5 };

これの型は何になるかというと:

 { x : Int, y : Int }

になる。宣言が不要なCのstructみたいな感じか。

で、typedefがあるのでこれを名前で呼ぶことができる。

 typedef Point = { x : Int, y : Int }
 var p1 : Point;

構造的サブタイプ(Structual subtyping)

部分集合になってるときに互換なものとして扱えるみたい。

 typedef Point = { x : Int, y : Int }
 typedef Point3D = { x : Int, y : Int, z : Int }
 var p3d : Point3D = { x : 0, y : 0, z : 0 };
 var pt : Point = p3d;

あるいは、「x:Intというフィールドを持つオブジェクト」という型指定ができるということか。

using

既存クラスにメソッドを追加する (というか、追加されたように見せる) 機能。

class StringHelp {
    public static function startsWith( s : String, sub : String ) { .... }
    public static function isSpace( s : String, ?pos : Int ) { .... }
}
...
using StringHelp;
...
      return s.startsWith("hello") && s.isSpace(6);

using StringHelpすることで、クラスStringHelpの各static関数について、その第一引数のクラス(ここではString) に対するメソッド呼び出しのような書き方(s.startsWith)で呼び出せるようになる。らしい。

Tips

標準ライブラリのソース

文字列のinterpolationがあるぞ!

文字列への変換を手でやらなくてすむので便利。

http://haxe.org/manual/string_interpolation

 var name = "Haxe";
 var x = 10;
 trace(Std.format("$name is $x times better than X"));

${}で式埋め込み、$$で$そのもの

printfデバッグ

 trace(1 + 1);  // console.logに出力される

乱数

 Std.random(4); // 整数
 Math.random(); // 小数

Array<Int> と Array<Float> に互換性がないのはなんで?

JSXで同じこと思ったんだけど、書いてあった:http://haxe.org/manual/variance そういえばScalaにもこんな話があったような…

コード例

IDでタグを取得する

import js.Lib;                                                                           
                                                                                         
class Main {                                                                             
  static function main() {                                                               
    Lib.window.onload = function(e: js.Dom.Event){                                       
      trace(Lib.document.getElementById("field"));                                       
    };                                                                                   
  }                                                                                      
}     
source: Haxe.hd
View on github | Report issue