Crystal
昨年末に「Ruby脳にはCrystalつらい Advent Calendar 2015」というのを書きました。 qiita.com 当時の Crystal のバージョンは 0.10 だったのですが、その後バージョンがあがって改善されてたりするので、紹介します。 カレントディレクトリに .crystal を作…
2/16 に Crystal 0.12 がリリースされました。 0.12 では Crystal に文字エンコーディング変換の仕組みが導入されました。 Ruby と同じような感じで String#encode や IO#set_encoding 等が追加されました。 といっても Crystal の文字エンコーディングは Ru…
前回も書いたように Crystal の String のエンコーディングは UTF-8 固定です。なので Ruby のようにバイナリデータを String オブジェクトで扱うことはできません。 バイナリデータは Pointer, Slice, MemoryIO で扱うことができるようです。 自分でもよく…
前に次のような記事を書きました。 tmtms.hatenablog.com Ruby と異なり、エンコーディングを変換したり UTF-8 として正しいバイト列かどうかを判定する方法もありません。つらい。 これを解決するために Crystal に String#scrub と String#valid_encoding?…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の25日目の記事です。 qiita.com Ruby の名前付き引数の例です。 def hoge(a, b=1, c: 2) p [a, b, c] end hoge(123) #=> [123, 1, 2] hoge(123, 456) #=> [123, 456, 2] hoge(123, c: 789) #=> [123…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の24日目の記事です。 qiita.com Crystal のソースコードは Crystal で記述されています。最初は Ruby で書かれていたようですが、現在はすべて Crystal で書かれています。 Ruby は本体と組み込みラ…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の23日目の記事です。 qiita.com メソッドに渡されたブロックを実行するには次の2つの方法があります。 def hoge yield end hoge{ p 123 } def hoge(&block) block.call end hoge{ p 123 } ですが、…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の22日目の記事です。 qiita.com タイトルのまんまですが、Crystal は Thread がなくてつらい。 Thread というクラスはありますが、ソースを見ると、 # Don't use this class, it is used internally…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の21日目の記事です。 qiita.com Crystal の String は UTF-8 固定なのでバイナリデータを String で扱うことはできません。 バイナリデータを扱うには String ではなく Slice を使います。 Slice(UI…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の20日目の記事です。 qiita.com 昨日の記事で、File#gets が nil を返すことがあるので、 line = File.open("/dev/urandom").gets if line.is_a? String # gets は nil を返すことがあるためこの if…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の19日目の記事です。 qiita.com 昨日の記事で Crystal の文字列は UTF-8 だと書きましたが、実行時に外部から UTF-8 以外の文字列を与えるとどうなるのでしょうか。 p File.open("/dev/urandom").ge…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の18日目の記事です。 qiita.com Ruby の文字列のエンコーディングはオブジェクト毎に異なる可能性があります。 エンコーディングが異なる文字列を結合したりマッチングさせようとすると例外になりま…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の17日目の記事です。 qiita.com Ruby では '〜' と "〜" は両方とも文字列(String)です。文字列を1文字ずつに分割しても、それは1文字の文字列です。 Crystal では '〜' は文字(Char)で、"〜" は文…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の16日目の記事です。 qiita.com 最近 Ruby でリテラル文字列を変更不可にするとかしないとかって話がありますが、Crystal の文字列は最初から変更不可です。 文字列オブジェクトを変更するようなメ…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の15日目の記事です。 qiita.com Ruby の String#to_i は数字以外の文字列の場合に 0 を返します。C の atoi() と同じです。 % ruby -e 'p "abc".to_i' 0 Crystal の String#to_i は数字以外の文字列…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の14日目の記事です。 qiita.com Ruby では nil.to_i は 0 になりますが、Crystal ではコンパイル時エラーになります。 % crystal eval 'nil.to_i' Error in line 1: undefined method 'to_i' for Ni…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の13日目の記事です。 qiita.com 昨日の記事に書いたように Crystal は変数を初期化せずに宣言だけすることができます。 ですが、宣言だけだと値は未定義です。未定義のまま参照すると例外が発生した…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の12日目の記事です。 qiita.com Crystal で Ruby と同じような感覚でインスタンス変数を使うと nil だと怒られることがあります。 class Hoge def hoge @hoge = "abc" @hoge.size end end Hoge.new.…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の11日目の記事です。 qiita.com Ruby には同じ機能なのに複数の名前があるメソッドがありますが、Crystal は基本的に1機能に1メソッド名という方針のようです。 それにより Ruby にはあるのに Cryst…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の10日目の記事です。 qiita.com Ruby だと、配列を展開してメソッドの引数にすることができます。 arg = [1, "abc", :foo] hoge(*arg) # hoge(1, "abc", :foo) と同じ Crystal だとこれはできません…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の9日目の記事です。 qiita.com 昨日の記事に「Tuple を使うとらくちんです」というコメントをもらいました。 タプルを使って書きなおしてみます。 [ { 1, "hoge" }, { 2, "fuga" }, { 3, "piyo" }, …
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の8日目の記事です。 qiita.com Ruby だと、プログラマーが配列の1番目の要素は整数で、2番目の要素が文字列で…といったように決めて、次のようなコードを書いたりすることがあります。 [ [ 1, "hoge…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の7日目の記事です。 qiita.com Crystal を何の気無しに使っていると、気がつくと .crystal というディレクトリがあちこちにできています。 Crystal はコンパイル時に .crystal というディレクトリを…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の6日目の記事です。 qiita.com 1日目の記事で配列が自動拡張されなくてつらいと書いたんですが、配列の範囲外の参照もエラーになります。 array = [0, 1, 2] array[3] [4337095] *CallStack::unwind…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の5日目の記事です。 qiita.com 5日目にして既にネタ切れでもう Ruby は関係ないしつらくもないんですけど、Crystal アドベントカレンダーで日本語ドキュメントがあることを知りました。 www.adventa…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の4日目の記事です。 qiita.com 昨日の記事で、Crystal は深さが不定の配列が作れなくてつらいと書いたんですが、 実際にできないわけないだろうから方法を調べて4日目の記事にしようと思ってたとこ…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の3日目の記事です。 qiita.com Ruby の配列は任意の型のオブジェクトが入りますが、Crystal は特定の型しか入りません。 空配列を作ろうとするとエラーになります。 array = [] #=> Syntax error in…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の2日目の記事です。 qiita.com Ruby だと実行時にエラーが発生すると、エラーが発生したプログラムの位置が出力されるのですが、 def hoge raise "hoge" end hoge % ruby hoge.rb hoge.rb:2:in `hog…
これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の1日目の記事です。 qiita.com Ruby だと配列の範囲外に値を代入すると、 array = [0, 1, 2] array[4] = 4 array #=> [0, 1, 2, nil, 4] のように、配列が自動拡張されるのですが、Crystal で同じこ…
前に Crystal の記事を書いて、 tmtms.hatenablog.com このスライドの中で、 と書いたんですが、現在は条件分岐中のメソッド定義はエラーになるようになっています。 if true def hoge end end % crystal hoge.cr Error in ./hoge.cr:2: can't declare def d…