On Thu, 27 Nov 2003 08:34:14 +0900, Chad Fowler wrote:
> On Thu, 27 Nov 2003, Mathieu Bouchard wrote:
>> A classic of evaluating strings is evaluating SQL code, [...]
>> the "?" placeholder has been introduced specially for that
>> purpose. In this case, it's almost the same situation, but about
>> embedding Ruby code into Ruby code.
> There's a big conceptual difference between what is happening with
> SQL and what is happening when you eval something. I view the SQL
> scenario as being not much different than any other interpreter.
> Part of the difference is host/eval language differences (do you
> ever eval SQL inside an engine which is written in SQL?) but more
> importantly, eval'ing is generally (including the case of Ruby,
> something that is delegated from one piece of code back up to the
> engine which parsed itself. I don't see this as being related, but
> it's possible that I'm missing something.

I've been thinking about this, and I *would* like to see a way to do
"parameterized" eval.

Basically, when I did some work on RSS handling, I took some meta
code and parameterized it. It looks something like:

  ACCESSOR_METHODS = %Q{self.rss_<type>_list << "<symbol>"}

  def make_method(symbol, type) #:nodoc:
    module_eval ACCESSOR_METHODS.gsub(/<symbol>/, 
symbol.id2name).gsub(/<type>/, type)
  end

  def rss_element(*symbols) #:nodoc:
    symbols.each { |symbol| make_method(symbol, "element") }
  end

The children of this class would do something like:

  attr_accessor :foo
  rss_element   :foo

Now, this case is relatively simple, as I can simply do string
substitutions, but if I wanted anything more than a string
substitution, I'd have to do something more complex (perhaps
marshaling).

I'm not sure that I'd want to see:

  ACCESSOR_METHODS = %Q{self.rss_?_list << "?"}

  def rss_element(*symbols)
    symbols.each { |symbol|
      module_eval(ACCESSOR_METHODS, "element", symbol.id2name)
    end
  end

It wouldn't work, anyway, since ? is a valid character in Ruby for
three different contexts. But could there not be a way of doing
parameterized evals?

-austin
--
austin ziegler    * austin / halostatue.ca * Toronto, ON, Canada
software designer * pragmatic programmer * 2003.11.28
                                         * 08.29.55