前回
Crystal のドキュメントはこの pdf が良い。
https://crystal-jp.github.io/introducing-crystal/assets/pdfs/introducing-crystal.pdf
前回の続きで、FizzBuzz をやってみた。
# $ crystal fizzbuzz.cr # 遅延評価 class Delay(T) def initialize(init_v : T, &block : -> T) @func = block @flag = false @value = init_v end def force unless @flag ret = @func.call @value = ret.nil? ? raise("@func.call is nil. #{@func}") : ret @flag = true end @value end end # Bool 構造体にメソッドを追加 struct Bool def if(t, e) return t.responds_to?(:force) ? t.force : t if self e.responds_to?(:force) ? e.force : e end end # 短縮マクロ macro d_i(x) Delay(Int32).new(0){{{x}}} end macro d_ai(x) Delay(Array(Int32)).new([0]){{{x}}} end macro d_s(x) Delay(String).new(""){{{x}}} end struct Int # FizzBuzz def fizzbuzz (s = (self.%(3).==(0).if "Fizz", "").+(self.%(5).==(0).if "Buzz", "")).==("").if self.to_s, s end end # 実行 puts (1..30).to_a.map &.fizzbuzz # => ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz", "16", "17", "Fizz", "19", "Buzz", "Fizz", "22", "23", "Fizz", "Buzz", "26", "Fizz", "28", "29", "FizzBuzz"]
代入式は、その入れた値が返ってくる事を利用した。
これはけっこう使えると思う。
FizzBuzz もワンライナーで書けた。