From: Markus Schirp Date: 2011-05-12T15:42:50+09:00 Subject: Re: how to make eval() faster? Too difficult? The most "stupid simple" dsl is IMHO block based... yourlib.rb ---------- module Yourlib class << self def define_processor(key,&block) processors << [key,&block] end def processors @processors ||= [] end def run(row) # row should be an hash processors.each do |key,block| input[key]=block.call(row) end end end end settings.rb ----------- require 'yourlib' Yourlib.define_processor :outcome_a do |current| current[:event_a] * current[:event_b] end Yourlib.define_processor :outcome_b do |current| current[:outcome_b] = current[:event_b] * current[:outcome_a] end File.readlines(somepath) do |row| out = Yourlib.run(preprocess(row)) do_something_fancy(out) end As long as your users do not use outcomes before they are produced you can do calculations based on the outcomes... If you need namespacing etc you can simply make an convention about the output key names... and maybe about the input keys too... or try to add (nested) namespacing. I new this DSL is messy and redundant in usage, but a better approach than using eval ;) Regards, Markus On Thu, May 12, 2011 at 03:18:56PM +0900, Zd Yu wrote: > Markus Schirp wrote in post #998159: > > The configuration file can be plain ruby! > > You can define your own DSL to manage the formulars. > > So you can load the file once and the formulars do not have to be > > evaled... > > Nice catch. Actually I did try to implement it as DSL at the beginning, > but finally I realized it is difficult to implement such a DSL in my > problem. So at last I went to the XML format configuration way. > > Below is the post I asked about DSL in 5 months ago: > http://www.ruby-forum.com/topic/696974#new > > -- > Posted via http://www.ruby-forum.com/.