Ruby で labels できるか
次のコードに等価なものを作りたい。
(defun f (a b) (labels ((g (c) (list a b c))) (g 'z))) (f 'x 'y) ; => (X Y Z)
新しい Object にシングルトンメソッドを定義しよう。
def f a, b Object.new.instance_eval { self.define_singleton_method(:g) do |c| [a,b,c] end g(:z) } end p f(:x, :y) # => [:x, :y, :z]
次は末尾再帰の階乗関数。
def fac n Object.new.instance_eval do self.define_singleton_method(:recur) do |n, acc| if n == 0 acc else recur(n-1, n * acc) end end recur(n, 1) end end p fac(10) # => 3628800