Ich möchte in der Lage sein, ein Lambda/Proc in meinem Ruby-Code zu schreiben, serialisieren, so dass ich es auf die Festplatte schreiben kann, und später das Lambda ausführen. Art wie ...Wie können Sie Ruby Code stringisieren/serialisieren?
x = 40
f = lambda { |y| x + y }
save_for_later(f)
Später, in einem separaten Lauf des Ruby-Interpreter, ich will für Procs zu der Lage sein, zu sagen ...
f = load_from_before
z = f.call(2)
z.should == 42
Marshal.dump funktioniert nicht. Ich weiß, Perl hat Data::Dump::Streamer, und in Lisp ist dies trivial. Aber gibt es einen Weg, es in Ruby zu machen? Mit anderen Worten, was wäre die Implementierung von save
?_
für _
später
bearbeiten: My answer below ist schön, aber es lässt sich nicht schließen freie Variablen über (wie x
) und serialisiert sie mit dem Lambda zusammen. Also in meinem Beispiel ...
x = 40
s = save_for_later { |y| x + y }
# => "lambda { |y|\n (x + y)\n}"
... die Zeichenfolge Ausgabe enthält keine Definition für x
. Gibt es eine Lösung, die dies berücksichtigt, vielleicht durch Serialisierung der Symboltabelle? Kannst du in Ruby darauf zugreifen?
Edit 2: Ich habe meine Antwort aktualisiert, um serialisierende lokale Variablen zu integrieren. Dies scheint akzeptabel.
Meine Version von Ruby2Ruby (1.2.4) scheint keine Übersetzungsmethode zu haben. Gibt es dafür in neueren Versionen eine andere API? –
Ich verstehe es nicht ganz, aber [dieses thread] (http://stackoverflow.com/questions/1144906/error-running-heckle-current-code-undefined-method-translate-for-ruby2ruby) empfiehlt Downgrade auf Ruby2Ruby 1.2 .2. Ich fand auch [diesen Affe-Patch] (http://gist.github.com/321038), der behauptet, es zu späteren Versionen hinzuzufügen. Habe es aber noch nicht ausprobiert. –
Es saugt, dass es nicht mit Ruby 1.9 funktioniert ... – Kludge