Quiero poder escribir un lambda/Proc en mi código Ruby, serializarlo para que pueda escribirlo en el disco, y luego ejecutar el lambda más tarde. Algo así como ...¿Cómo se escribe/serializa el código de Ruby?
x = 40
f = lambda { |y| x + y }
save_for_later(f)
Más tarde, en una ejecución separada del intérprete Ruby, quiero ser capaz de decir ...
f = load_from_before
z = f.call(2)
z.should == 42
Marshal.dump no funciona para Proc. Sé que Perl tiene Data::Dump::Streamer, y en Lisp esto es trivial. ¿Pero hay una forma de hacerlo en Ruby? En otras palabras, ¿cuál sería la implementación de save
?_
para _
posterior
Editar: My answer below es agradable, pero no se cierra sobre variables libres (como x
) 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 cadena de salida no incluye una definición para x
. ¿Hay alguna solución que tenga esto en cuenta, tal vez mediante la serialización de la tabla de símbolos? ¿Puedes acceder a eso en Ruby?
Editar 2: Actualicé mi respuesta para incorporar serializar variables locales. Esto parece aceptable.
Mi versión de Ruby2Ruby (1.2.4) no parecen tener un método translate. ¿Hay una API diferente para esto en versiones más nuevas? –
yo no entiendo muy bien, pero [a este tema] (http://stackoverflow.com/questions/1144906/error-running-heckle-currentcode-undefined-method-translate-for-ruby2ruby) recomienda la degradación hasta 1,2 Ruby2Ruby .2. También encontré [este parche de mono] (http://gist.github.com/321038) que afirma agregarlo a versiones posteriores. No lo he probado sin embargo. –
Es un asco que no funciona con Ruby 1.9 ... – Kludge