Hatena::Groupocaml-nagoya

yoshihiro503の関数的日記

2008-12-03 (Wed)

haXeでhaXe -> schemeジェネレーター

| 08:57 | haXeでhaXe -> schemeジェネレーター - yoshihiro503の関数的日記 を含むブックマーク はてなブックマーク - haXeでhaXe -> schemeジェネレーター - yoshihiro503の関数的日記

haXehaXeをパースしてscheme プログラムを生成しよう。

class Genscheme {

    public static function gen_class_field (class_field) {
	return switch class_field {
	    case fvar (name, expr):
		"(define "+name+" "+gen_expr(expr)+")";
	    case ffun (name, fun):
		"(define "+name+" "+gen_expr(efunction(fun))+")";
	    }
    }
    
    static function gen_expr (expr) {
	return switch expr {
	case econst(c): gen_const(c);
	case ecall(f, args):
            "("+gen_expr(f)+" "+List.string_concat (" ",List.map(gen_expr,args))+")";
	case efunction (f):
	    switch f {
	    case func(args, body):
	        "(lambda ("+List.string_concat (" ",args)+") "+gen_expr(body)+")";
	    }
	//case eswitch(e, cases): //TODO switch式
	//case evars (vs, e): //TODO let式
	case eexprs(e1, e2):
	    gen_expr(e1);
	case ereturn(e): gen_expr(e);
	default: "";
	}
    }


    static function gen_const (c) {
	return switch c {
	    case int(x): x;
	    case string(x): '"' + x + '"';
	    case ident(x): x;
	    case ctype(x): x;
	    }
    }
}

実行例

入力:

  static function main () {
    trace ("Hello, world!");
  }

出力:

(define main (lambda () (trace "Hello, world!")))