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