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