Ruby black magic? Meta Programming

T

Tom Willis

My first exposure to Ruby was from Jim, and his "10 things every java
programmer should know about ruby" presentation.

Anyway, I probably shouldn't even be thinking about this kind of stuff
yet, but one thing in the presentation that I dug a lot was the use of
overriding Kernel#method_missing to queue messages and play them back
in order.

Anyway, I want to know what other kind of cool,i guess I'll call it
metaprogramming, can be done in ruby.


For example, I remember reading something about Eiffel having the
ability to declare pre and post conditions for method calls on
objects, essentially bringing this criteria in as part of the
interface. Can something like this be done in Ruby? I'm assuming so,
but for some reason my google hits keep referring me to Pyhon's
Metaclass things, go figure.

Anyone got a link?

TIA
 
E

ES

My first exposure to Ruby was from Jim, and his "10 things every java
programmer should know about ruby" presentation.

Anyway, I probably shouldn't even be thinking about this kind of stuff
yet, but one thing in the presentation that I dug a lot was the use of
overriding Kernel#method_missing to queue messages and play them back
in order.

Anyway, I want to know what other kind of cool,i guess I'll call it
metaprogramming, can be done in ruby.


For example, I remember reading something about Eiffel having the
ability to declare pre and post conditions for method calls on
objects, essentially bringing this criteria in as part of the
interface. Can something like this be done in Ruby? I'm assuming so,
but for some reason my google hits keep referring me to Pyhon's
Metaclass things, go figure.

Anyone got a link?

Currently pre/postconditions are proposed for Ruby 2.0, see\
http://www.rubygarden.org/ruby?Rite

You can achieve the same effect by creating a meta for something like
def_pre :methodname, def_post :methodname with associated blocks. Then
alias the actual :methodname, make the pre block respond to :methodname;
pre executes its block and then calls :methodname, after which post block
is called.
Thomas G. Willis

E
 
W

William Morgan

Excerpts from ES's mail of 12 Mar 2005 (EST):
You can achieve the same effect by creating a meta for something like
def_pre :methodname, def_post :methodname with associated blocks. Then
alias the actual :methodname, make the pre block respond to
:methodname; pre executes its block and then calls :methodname, after
which post block is called.

See http://www.thekode.net/ruby/techniques/CapturingMethods.html for an
example implementation (which doesn't use alias).

But there are limitations to this technique that will only be resolved
in 2.0.
 
D

Dave Burt

Bruce Willis said:
My first exposure to Ruby was from Jim, and his "10 things every java
programmer should know about ruby" presentation.

Anyway, I probably shouldn't even be thinking about this kind of stuff
yet, but one thing in the presentation that I dug a lot was the use of
overriding Kernel#method_missing to queue messages and play them back
in order.

Anyway, I want to know what other kind of cool,i guess I'll call it
metaprogramming, can be done in ruby.

I found this fun:
http://www.dave.burt.id.au/ruby/roman_numerals.rb

Cheers,
Dave
 
M

Mathieu Bouchard

Anyway, I want to know what other kind of cool,i guess I'll call it
metaprogramming, can be done in ruby.

Here's a previously-unreleased edition of RubyX11:

http://artengine.ca/matju/RubyX11/RubyX11-0.6.pre1.tar.gz

Compared to the better-known version 0.5, this one replaces the
type-declaration interpreter, by a type-declaration _compiler_. The output
of the compiler is eval'ed at load time.

This is an unfinished project. I wrote the compiler in Oct.2001.

Because RubyX11 makes a clean separation between interface descriptions
and the actual task of encoding/decoding, this "client library" could also
be useful in writing a X11 _server_ in Ruby, as well as other things.
For example, I remember reading something about Eiffel having the
ability to declare pre and post conditions for method calls on
objects, essentially bringing this criteria in as part of the
interface. Can something like this be done in Ruby?

Ruby's backtracking method-lookup allows a nice kludge for imitating
pre/post conditions, as can be seen in MetaRuby (_my_ MetaRuby project,
not the other one). Also, Andrew Hunt had something much closer to
Eiffel's way, but using a preprocessor (?). And also a more generic
solution is AspectR, which implements LISP-style method-combinations
:)before/:after/:around/etc) and possibly a few other things (i don't
recall which).

_____________________________________________________________________
Mathieu Bouchard -=- Montréal QC Canada -=- http://artengine.ca/matju
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,013
Latest member
KatriceSwa

Latest Threads

Top