¿Cómo encordar / serializar código Ruby?
Quiero poder escribir un lambda / Proc en mi código de Ruby, serializarlo para poder escribirlo en el disco y luego ejecutar el lambda. Algo así como...
x = 40
f = lambda { |y| x + y }
save_for_later(f)
Más adelante, en una ejecución separada del intérprete de Ruby, quiero poder decir ...
f = load_from_before
z = f.call(2)
z.should == 42
Marshal.dump no funciona para Procs. Sé que Perl tieneData :: Dump :: Streamer, y en Lisp esto es trivial. ¿Pero hay una manera de hacerlo en Ruby? En otras palabras, ¿cuál sería la implementación desave<code>_</code>for<code>_</code>later
?
Editar: Mi respuesta abajo Es bueno, pero no se cierra sobre las variables libres (comox
) y serializarlos junto con la lambda. Así que en mi ejemplo ...
x = 40
s = save_for_later { |y| x + y }
# => "lambda { |y|\n (x + y)\n}"
... la salida de cadena no incluye una definición parax
. ¿Hay alguna solución que tenga esto en cuenta, quizás al serializar la tabla de símbolos? ¿Puedes acceder a eso en Ruby?
Editar 2: Actualicé mi respuesta para incorporar la serialización de variables locales. Esto parece aceptable.