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