コラッツ予想がとけたらいいな2

自分の考察を書いていきます。

Crystal をやってみた その7(FizzBuzz)

前回


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ワンライナーで書けた。