Como você stringize / serialize o código Ruby?
Eu quero ser capaz de escrever um lambda / Proc no meu código Ruby, serializá-lo para que eu possa escrevê-lo em disco e, em seguida, executar o lambda mais tarde. Mais ou menos como ...
x = 40
f = lambda { |y| x + y }
save_for_later(f)
Mais tarde, em uma execução separada do intérprete Ruby, eu quero poder dizer ...
f = load_from_before
z = f.call(2)
z.should == 42
Marshal.dump não funciona para Procs. Eu sei que o Perl temData :: Dump :: Streamere em Lisp isso é trivial. Mas existe uma maneira de fazer isso em Ruby? Em outras palavras, qual seria a implementação desave<code>_</code>for<code>_</code>later
?
Editar: Minha resposta abaixo é legal, mas não fecha variáveis livres (comox
) e serializá-los junto com o lambda. Então no meu exemplo ...
x = 40
s = save_for_later { |y| x + y }
# => "lambda { |y|\n (x + y)\n}"
... a saída da string não inclui uma definição parax
. Existe uma solução que leve isso em consideração, talvez serializando a tabela de símbolos? Você pode acessar isso em Ruby?
Editar 2: Atualizei minha resposta para incorporar variáveis locais de serialização. Isso parece aceitável.