フィボナッチができた。
# crystal test4.cr # 遅延評価 class Delay def initialize(&block : String -> Int32) @func = block @flag = false #@value = nil @value = 0 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 # puts true.if "then", "else" struct Int # 階乗 def fact self.<=(0).if 1, Delay.new{self.-(1).fact.*(self)} end # フィボナッチ def fib self.<=(1).if (self.==(0).if 0, 1), Delay.new{self.-(1).fib.+(self.-(2).fib)} end end # 実行 puts 10.fact # => 3628800 puts (0..10).to_a.map &.fib # => [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]