# Serializing Ruby code

**URL:** <https://www.ruby-forum.com/t/serializing-ruby-code/78155>\
**Category:** Ruby\
**Created:** [December 3, 2006, 4:07am UTC](https://www.ruby-forum.com/t/serializing-ruby-code/78155 "2006-12-03T04:07:48Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Victor\_SZverokSS\_Sh](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/f04885/32.png) [@Victor\_SZverokSS\_Sh](https://www.ruby-forum.com/u/Victor_SZverokSS_Sh)\
**Post date:** [December 3, 2006, 4:07am UTC](https://www.ruby-forum.com/t/serializing-ruby-code/78155/1 "2006-12-03T04:07:48Z")

</div>

Hi all.

A bit of philosophy.

We have Marshal[1] to serializing Ruby’s objects (and also YAML and so  
on).  
AFAIK, Rails community even uses objects serialization for program’s  
state  
saving.  
But, existing marshalling/serialization can serialize only data, not  
plain  
code; this fact is restricting for their applications. For example,  
Smalltalk-style “image” (entire program state, which can be loaded and  
continued) is impossible.

But! We have a method for translating code-to-data - ParseTree[2], and  
we  
even have method to translate back data-to-code (though a bit  
roundabout) -  
ruby2ruby[3].

Had somebody thought about gathering all this to create full solution  
for  
entire running program “saving” and “loading”? (Or, may be, somebody  
already  
done this and I’m missing?)

It can be really cool. And it seems completely possible.

V.

1. [module Marshal - RDoc Documentation](http://www.ruby-doc.org/core/classes/Marshal.html)
2. [http://rubyforge.org/projects/parsetree](http://rubyforge.org/projects/parsetree)
3. [http://seattlerb.rubyforge.org/ruby2ruby/](http://seattlerb.rubyforge.org/ruby2ruby/)

---

<div class="post-metadata">

**Author:** ![Victor\_SZverokSS\_Sh](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/f04885/32.png) [@Victor\_SZverokSS\_Sh](https://www.ruby-forum.com/u/Victor_SZverokSS_Sh)\
**Post date:** [December 3, 2006, 4:17am UTC](https://www.ruby-forum.com/t/serializing-ruby-code/78155/2 "2006-12-03T04:17:49Z")

</div>

If I understand your question correctly, what you’re looking for is  
serializable continuations.

I’ve checked this a while back, and the current stable Ruby branch  
(1.8.x) does not have those, though it supports continuations  
themselves. There are no plans to add serialization for continuations  
in this branch, afaik. Perhaps it would be added in the future Ruby  
implementations (at least in some of those ;-)) but here’s where the  
implementation developers chime in…

-Chris

---

<div class="post-metadata">

**Author:** ![Victor\_SZverokSS\_Sh](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/f04885/32.png) [@Victor\_SZverokSS\_Sh](https://www.ruby-forum.com/u/Victor_SZverokSS_Sh)\
**Post date:** [December 3, 2006, 5:01am UTC](https://www.ruby-forum.com/t/serializing-ruby-code/78155/3 "2006-12-03T05:01:53Z")

</div>

On Dec 2, 2006, at 19:06 , Victor Zverok S. wrote:

> Smalltalk-style “image” (entire program state, which can be loaded and  
> entire running program “saving” and “loading”? (Or, may be,  
> somebody already  
> done this and I’m missing?)

You’d need more than that to get a full image to work (like recording  
the ObjectSpace, the symbol table, globals, …)

Also, ParseTree doesn’t capture the closure so you can’t copy the  
full state of the interpreter:

$ cat closure.rb  
def make\_proc  
x = 1  
proc do |y| y + x end  
end

p = make\_proc

puts p.call(2)

require ‘rubygems’  
require ‘ruby2ruby’

ruby = p.to\_ruby

puts ruby

q = eval ruby

puts q.call(2)

$ ruby closure.rb  
3  
proc { |y|  
(y + x)  
}  
(eval):2: undefined local variable or method `x' for main:Object (NameError) from closure.rb:19:in `call’  
from closure.rb:19

–  
Eric H. - removed\_email\_address@domain.invalid - [http://blog.segment7.net](http://blog.segment7.net)

I LIT YOUR GEM ON FIRE!
