素朴な自作言語のコンパイラをGoに移植した


移植一覧に戻る


やっつけなので汚いです。ライフゲームコンパイルが通ったのでヨシ、というレベルのものです。

github.com


移植元

memo88.hatenablog.com

ベースになっているバージョン: tag:50 のあたり

(2021-06-20 追記) ステップ60 の修正まで反映しました

メモ

  • Go は 3, 4 年前にちょっとしたCLIツールを作った程度
  • C の後だとすごい楽ちん
  • メソッドも便利
  • ほんとは練習のためにもっとスライスを使いたかったけど、あまり使わないままできあがってしまった

今回の実験コーナー。

これまで Dart への移植 のときに set を不要にし、 Java への移植 のときに call を不要にし、 Perl への移植 のときに call_set を不要にしてきました。

今回はこれらを全部適用して、さらに Python への移植 のときにやった、 Ruby っぽい見た目への変更も加えました。

trial ブランチ でやってみました。

vgコードはこんな感じ。 var を除けばこれはもう Ruby ですね。

def calc_next_gen(current_val, count)
  # 注目しているセルの次世代の生死
  var next_val = 0;

  case
  when (current_val == 0)
    case
    when (count == 3)
      next_val = 1;
    end
  when (0 == 0)
    case
    when (count == 2)
      next_val = 1;
    when (count == 3)
      next_val = 1;
    end
  end
  
  return next_val;
end

def main()
  var w = 5; # 盤面の幅
  var h = 5; # 盤面の高さ

  # 初期状態の設定
  vram_set(w, 1, 0, 1);
  vram_set(w, 2, 1, 1);
  vram_set(w, 0, 2, 1);
  vram_set(w, 1, 2, 1);
  vram_set(w, 2, 2, 1);

  var gen_limit = 0;
  var gen = 1;
  while (gen != gen_limit)
    make_next_gen(w, h);
    replace_with_buf();
    gen = gen + 1;
  end
end