|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
I have this code to do timing tests:
def tm(code); s=Time.now; eval code; Time.now-s end I use it like this: tm 'some code' I have this function that can take two inputs. When I run it with just one input like this: tm 'Pn(130)' I can time it with no problems. When I use a second input like this, tm 'Pn(130, mcps)' running in irb (1.8.6 and 1.9.0-1) it returns an unknown method or variable message for the second input. Is this a bug, or expected behavior? Can I work around this? Thanks in advance. |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
On Jun 7, 11:30pm, jzakiya <jzak...@mail.com> wrote:
> I have this code to do timing tests: > > def tm(code); s=Time.now; eval code; Time.now-s end > > I use it like this: > > tm 'some code' > > I have this function that can take two inputs. > When I run it with just one input like this: > > tm 'Pn(130)' > > I can time it with no problems. > > When I use a second input like this, > > tm 'Pn(130, mcps)' > > running in irb (1.8.6 and 1.9.0-1) it returns an > unknown method or variable message for the > second input. > > Is this a bug, or expected behavior? > Can I work around this? > > Thanks in advance. I don't believe that is a bug. At the time that 'eval' is running the code, the variable 'mcps' is out of scope (assuming it is a variable). You may need to look into bindings: http://onestepback.org/index.cgi/Tec...yBindings.rdoc. Let me know if I'm way off base. I do hope that s. -- MilesZS |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
I think a more "ruby" implementation of tm would be...
def tm start = Time.now yield return Time.now - start end duration = tm { # any code you want to time goes here } On Jun 7, 2008, at 11:33 PM, jzakiya wrote: > I have this code to do timing tests: > > def tm(code); s=Time.now; eval code; Time.now-s end > > I use it like this: > > tm 'some code' > > I have this function that can take two inputs. > When I run it with just one input like this: > > tm 'Pn(130)' > > I can time it with no problems. > > When I use a second input like this, > > tm 'Pn(130, mcps)' > > running in irb (1.8.6 and 1.9.0-1) it returns an > unknown method or variable message for the > second input. > > Is this a bug, or expected behavior? > Can I work around this? > > Thanks in advance. > |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
of course... it's very "unruby" to say return, so...
def tm start = Time.now yield Time.now - start end or (if you seem to prefer the one line syntax... def tm; s=Time.now;yield;Time.now-s end On Jun 8, 2008, at 12:10 PM, Mike Cargal wrote: > I think a more "ruby" implementation of tm would be... > > def tm > start = Time.now > yield > return Time.now - start > end > > duration = tm { > # any code you want to time goes here > } > On Jun 7, 2008, at 11:33 PM, jzakiya wrote: > >> I have this code to do timing tests: >> >> def tm(code); s=Time.now; eval code; Time.now-s end >> >> I use it like this: >> >> tm 'some code' >> >> I have this function that can take two inputs. >> When I run it with just one input like this: >> >> tm 'Pn(130)' >> >> I can time it with no problems. >> >> When I use a second input like this, >> >> tm 'Pn(130, mcps)' >> >> running in irb (1.8.6 and 1.9.0-1) it returns an >> unknown method or variable message for the >> second input. >> >> Is this a bug, or expected behavior? >> Can I work around this? >> >> Thanks in advance. >> > > Mike Cargal mike@cargal.net http://www.cargal.net |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
On Mon, Jun 09, 2008, Mike Cargal wrote:
> of course... it's very "unruby" to say return, so... I don't think this is true at all. There are certainly people who prefer the implicit return, but likewise there are people who do not. I'm in the latter camp, as should be obvious ![]() Ben |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
On Jun 8, 3:22 pm, Mike Cargal <m...@cargal.net> wrote:
> of course... it's very "unruby" to say return, so... > > def tm > start = Time.now > yield > Time.now - start > end > > or (if you seem to prefer the one line syntax... > > def tm; s=Time.now;yield;Time.now-s end > > On Jun 8, 2008, at 12:10 PM, Mike Cargal wrote: > > > > > I think a more "ruby" implementation of tm would be... > > > def tm > > start = Time.now > > yield > > return Time.now - start > > end > > > duration = tm { > > # any code you want to time goes here > > } > > On Jun 7, 2008, at 11:33 PM, jzakiya wrote: > > >> I have this code to do timing tests: > > >> def tm(code); s=Time.now; eval code; Time.now-s end > > >> I use it like this: > > >> tm 'some code' > > >> I have this function that can take two inputs. > >> When I run it with just one input like this: > > >> tm 'Pn(130)' > > >> I can time it with no problems. > > >> When I use a second input like this, > > >> tm 'Pn(130, mcps)' > > >> running in irb (1.8.6 and 1.9.0-1) it returns an > >> unknown method or variable message for the > >> second input. > > >> Is this a bug, or expected behavior? > >> Can I work around this? > > >> Thanks in advance. > > Mike Cargal > m...@cargal.nethttp://www.cargal.net Thanks, this works great. I learned something. ;-) It sort of acts like a lamda. But is that still a bug in eval? Jabari |
|
|
|
#7 |
|
Messages: n/a
Hébergeur: |
> But is that still a bug in eval?
> > Jabari My question is why does eval("b = 6") print b err and b = nil eval("b = 6") print b succeed? Eval has its own sub-scope? Note also that eval("b = 6", binding) print b also fails. Is this intended, or just a side-effect of the 'parse then execute' stratagem? Also as an interesting note, if you have code1 eval("code") code2 with 1.8.6, It appears to 'reparse' code2 after the eval has completed. I assume to make sure that it has accommodated for new variables or something. Except that you actually can't add new local variables, so it must be something else. Thanks. -R -- Posted via http://www.ruby-forum.com/. |
|
![]() |
| Outils de la discussion | |
|
|