とりあえず触って慣れようということで、何も分からないところからいきなり作り初めてその都度調べるという感じで雑に書いてみました。
移植元
ライフゲームのプログラムだけコンパイルできればOKという簡単なコンパイラです。
ベースになっているバージョン: tag:57 のあたり
作り方はここに全部書いています(Ruby 版のものですが): vm2gol v2 製作メモ
メモ
主な部分のサイズ(行数):
$ wc -l *.jl lib/utils.jl
359 codegen.jl
113 lexer.jl
360 parser.jl
56 lib/utils.jl
888 合計
Ruby のような動的言語で書くのと似たフィーリングで書けました。
ただし、こういうのはダメで、
xs = ["a"]
push!(xs, 1) # xs に整数を追加
# => ERROR: LoadError: MethodError: Cannot `convert` an object of type Int64 to an object of type String
次のように型について教えてあげないといけない、なんて場面はあったり。
xs = Any["a"]
push!(xs, 1)
今回のおためし。
ブランチ: trial
今回は case 文のネストを減らしてみました。
おためしというか v3 ですでに適用済みになっていて、 v2 にも取り込もうかなと考えているもの。
// before
case {
(current_val == 0) {
case {
(count == 3) {
set next_val = 1;
}
}
(0 == 0) {
case {
(count == 2) {
set next_val = 1;
}
(count == 3) {
set next_val = 1;
}
}
}
}
// after
case
when (current_val == 0) {
case
when (count == 3) {
set next_val = 1;
}
when (0 == 0) {
case
when (count == 2) {
set next_val = 1;
}
when (count == 3) {
set next_val = 1;
}
}
{ 〜 } が1段なくなるため、ネストが減り、行数も減ってちょっとコンパクトになります。
ついでに、when 句の先頭にキーワード when を置くようにしてみました。パーサの都合としてはあってもなくてもほとんど違いはなく、 when を置いた方がなんとなく見た目的に落ち着きがよいかな、という程度の理由です。
他の言語への移植
| 記事 | リポジトリ | 日付 |
|---|---|---|
| Haskell | github | 2021-06-28 |
| OCaml | github | 2021-06-26 |
| Pascal | github | 2021-05-22 |
| Rust | github | 2021-04-07 |
| Crystal | github | 2021-03-27 |
| Kotlin | github | 2021-01-14 |
| Zig | github | 2021-01-07 |
| LibreOffice Basic | github | 2020-12-14 |
| Go | github | 2020-09-25 |
| PHP | github | 2020-09-18 |
| C♭ | github | 2020-09-13 |
| Perl | github | 2020-09-08 |
| C | github | 2020-09-06 |
| Java | github | 2020-08-30 |
| Dart | github | 2020-08-22 |
| Python | github | 2020-08-19 |
| TypeScript (Deno) | github | 2020-08-15 |