tag:crieit.net,2005:https://crieit.net/tags/crystal/feed
「crystal」の記事 - Crieit
Crieitでタグ「crystal」に投稿された最近の記事
2021-03-28T06:52:10+09:00
https://crieit.net/tags/crystal/feed
tag:crieit.net,2005:PublicArticle/16778
2021-03-28T06:15:18+09:00
2021-03-28T06:52:10+09:00
https://crieit.net/posts/Crystal
素朴な自作言語のコンパイラをCrystalに移植した
<p>Crystal が 1.0 になりましたね 🎉</p>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://crystal-lang.org/2021/03/22/crystal-1.0-what-to-expect.html">Crystal 1.0 - What to expect - The Crystal Programming Language</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://codezine.jp/article/detail/13820">プログラミング言語Crystal、初のメジャーリリースとなるバージョン1.0を公開:CodeZine(コードジン)</a></li>
</ul>
<p>めでたい。</p>
<p>というわけで(といいつつ少し前から作っていたのですが)移植しました。例によってライフゲームのコンパイルが通ったのでヨシ、という程度の雑なものです。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-crystal">https://github.com/sonota88/vm2gol-v2-crystal</a></p>
<h1 id="移植元"><a href="#%E7%A7%BB%E6%A4%8D%E5%85%83">移植元</a></h1>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/05/04/155425">Rubyで素朴な自作言語のコンパイラを作った</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2">https://github.com/sonota88/vm2gol-v2</a></li>
</ul>
<p>ベースになっているバージョン: <a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2/tree/56">tag:56</a> のあたり</p>
<h1 id="メモ"><a href="#%E3%83%A1%E3%83%A2">メモ</a></h1>
<ul>
<li><code>is_a?</code> で型を調べて分岐させると型が制限される。ここらへんは自分が知ってる中では TypeScript が近い。
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://ja.crystal-lang.org/reference/syntax_and_semantics/if_varis_a.html">https://ja.crystal-lang.org/reference/syntax_and_semantics/if_varis_a.html</a></li>
</ul></li>
<li>ユニオン型からのキャスト: <code>as</code>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://ja.crystal-lang.org/reference/syntax_and_semantics/as.html">https://ja.crystal-lang.org/reference/syntax_and_semantics/as.html</a></li>
</ul></li>
<li><code>of</code> による型の指定
<ul>
<li>> これは推論された型を置き換えるので、生成時には同じ型しか入っていないけれど、あとで別の型が入ってくるような場合に対応できます。<br />
<a target="_blank" rel="nofollow noopener" href="https://ja.crystal-lang.org/reference/syntax_and_semantics/literals/array.html">https://ja.crystal-lang.org/reference/syntax_and_semantics/literals/array.html</a></li>
</ul></li>
<li>String からシンボルへの変換
<ul>
<li>できなさそうだった</li>
<li><a target="_blank" rel="nofollow noopener" href="https://ja.crystal-lang.org/reference/syntax_and_semantics/literals/symbol.html">https://ja.crystal-lang.org/reference/syntax_and_semantics/literals/symbol.html</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://crystal-lang.org/api/1.0.0/String.html">https://crystal-lang.org/api/1.0.0/String.html</a></li>
</ul></li>
<li>グローバル変数は使えない
<ul>
<li>> しかし Crystal にグローバル変数はありません。代わりにクラス変数や定数を使ってください。<br />
<a target="_blank" rel="nofollow noopener" href="https://crystal-jp.github.io/introducing-crystal/chapters/03-syntax.html">https://crystal-jp.github.io/introducing-crystal/chapters/03-syntax.html</a></li>
</ul></li>
<li>レキサの出力も <code>["kw", "func", 1]</code> のような JSON にしてみた。 少し冗長になるけど、扱いが楽になるので良さそう。 これは Ruby 版にフィードバックしようかな。</li>
</ul>
sonota486