とりあえず触って慣れようということで、何も分からないところからいきなり作り初めてその都度調べるという感じで雑に書いてみました。
https://github.com/sonota88/vm2gol-v2-julia
ライフゲームのプログラムだけコンパイルできればOKという簡単なコンパイラです。
ベースになっているバージョン: tag:57 のあたり
できあがりサイズ(行数)は Ruby 版と同じくらい。
$ wc -l *.jl lib/*.jl
359 codegen.jl
113 lexer.jl
360 parser.jl
107 lib/json.jl
56 lib/utils.jl
995 合計
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
を置いた方がなんとなく見た目的に落ち着きがよいかな、という程度の理由です。
上から新しい順。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント