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

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

Crystal をやってみた その5(ifをマクロに)

if をマクロにしたらスッキリした。チェーンでは書けなくなるけど。
マクロの引数は先行評価されないからね。
三項演算子使えば良いじゃんと思ったのは内緒だ)


# $ crystal test6.cr

macro mif(b, t, e)
  return {{t}} if {{b}}
  {{e}}
end

struct Int
  # 階乗
  def fact
    mif self.<=(0), 1, self.pred.fact.*(self)
  end
  # フィボナッチ
  def fib
    mif self.<=(1), (mif self.==(0), 0, 1), self.pred.fib.+(self.pred.pred.fib)
  end
  # コラッツ (0 は無限ループ)
  def collatz
    mif self.==(1), [1], (mif self.odd?, self.*(3).succ.collatz.unshift(self), self.tdiv(2).collatz.unshift(self))
  end
  def hoge2
    mif self.<=(0), "1", "yaahhhh"
  end
end

# 実行
puts 10.fact # => 3628800

puts (0..10).to_a.map &.fib # => [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

puts 3.collatz # => [3, 10, 5, 16, 8, 4, 2, 1]
puts 3.hoge2 # => yaahhhh