On Thu, May 12, 2011 at 8:08 AM, Zd Yu <zdyu2000 / gmail.com> wrote:
> Joel VanderWerf wrote in post #998154:
>> On 05/11/2011 09:53 PM, Zd Yu wrote:
>>> make it faster?
>> Can you eval your formulas into methods, and call the methods on the
>> data samples?
>
> No. I need flexibility, i.e., allow users to define their own formulas
> in the configuration file.

I believe you did not fully understand what Joel suggested.  You do
have that flexibility and you need to invoke eval only _once_ per
formula (for the initial compilation of the formula) but not for every
evaluation.  Example:

# really too simplistic!
formulas = Hash.new do |h, form|
  expr = form.sub(/\A.*?=\s*/, '')
  vars = expr.scan(/[a-z]\w*/i).uniq
  code = "lambda do |#{vars.join(', ')}| #{expr} end"
  p vars, code
  h[form] = eval(code)
end

# test
[
  'x = y * 2 + z',
  'z = y * x',
].each do |f|
  puts f

  10.times do |i|
    printf "%s: %d %d => %f\n", f, i, i*2, formulas[f][i, i*2]
  end
end

I'd prefer the DSL approach though.

Kind regards

robert

-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/