Why does everything have to be Math.<func>(num)? Isn't num.func more object oriented-ish? For example: >> (Math.methods - Object.methods).select {|x| Math.method(x).arity == 1}.each do |x| ?> Numeric.class_eval { ?> define_method(x.to_sym) { Math.send(x.to_sym, self) } >> } >> end => ["tan", "frexp", "sinh", "exp", "acos", "tanh", "log", "asin", "acosh", "cos", "log10", "atan", "erf", "asinh", "sin", "sqrt", "cosh", "erfc", "atanh"] >> *5.sqrt* => 2.23606797749979 >> *Math.sqrt(5)* => 2.23606797749979 >> I think the first one, 5.sqrt, looks much better than Math.sqrt(5). Thanks, Dan

on 2007-01-09 02:34

on 2007-01-09 04:33

Daniel Finnie [mailto:danfinnie@optonline.net] : # >> (Math.methods - Object.methods).select {|x| # Math.method(x).arity == # 1}.each do |x| # ?> Numeric.class_eval { ?> define_method(x.to_sym) { # Math.send(x.to_sym, self) } >> } # >> end # => ["tan", "frexp", "sinh", "exp", "acos", "tanh", "log", "asin", # "acosh", "cos", "log10", "atan", "erf", "asinh", "sin", # "sqrt", "cosh", # "erfc", "atanh"] # >> *5.sqrt* # => 2.23606797749979 # >> *Math.sqrt(5)* # => 2.23606797749979 # >> # # I think the first one, 5.sqrt, looks much better than Math.sqrt(5). Indeed, but only on the first glance. Math.sqrt *is the sine function; which in turn has its own set of properties/behavior among the gazillion of other functions found in mathematics. You pass only 5 here as the parameter. So it is not really object for objects sake. We have to bear in mind what object we want to center our minds on. Here, in this case, the object may be the sine behavior, and the behavior varies by changing the parameter provided. And hey, is 5 in degrees or in radians? Maybe that should be 5.radians.sine or sine(5.radians) --just joking :) kind regards -botp ps: i do also use 5.sin though. sometimes, i feel it is not good to stick to traditions especially when i'm teaching my kids ruby. in programming, i do not want them to think that *it's the *only way (we write things).. Welcome to the brave new world of ruby. # Thanks, # Dan

on 2007-01-09 07:35

Daniel Finnie wrote: > Why does everything have to be Math.<func>(num)? Isn't num.func more > object oriented-ish? In addition to the answers by others, what would you do for those math functions whose arity isn't 1? Math.methods(false).select{ |n| Math.method(n).arity != 1 } #=> ["hypot", "atan2", "ldexp"] All three take two arguments. While 3.hypot(4) *might* make sense--given one leg of a right triangle, how long is the hypotenuse to a given other leg--30.atan2( 40 ) makes little sense to me. A few exceptions might not make a good arguments against 19 possibly plausible cases. In my opinion, however, once you have to break the rule it makes sense to look for a new way to handle all the cases similarly. And, personally, I agree with Matz - the trigonometric functions simply look more correct (to me) as functions that take an argument, not methods invoked upon a number. That's purely a matter of taste, though.

on 2007-01-09 14:13

On 1/9/07, Phrogz <gavin@refinery.com> wrote: > All three take two arguments. While 3.hypot(4) *might* make > sense--given one leg of a right triangle, how long is the hypotenuse to > a given other leg--30.atan2( 40 ) makes little sense to me. hypot and atan are vector methods, so [30, 40].atan2, [3,4].hypot would be correct in the OO-sense, much like #max and #min are in Array and not Math (compare to e.g. JavaScript where there is Math.max and Math.min)

on 2007-01-09 20:21

Daniel Finnie wrote: > Why does everything have to be Math.<func>(num)? Isn't num.func more > object oriented-ish? Having the math functions in a module means there could be an alternate module with a different implementation. Why another implementation of Math::sin? Well, I notice that some folks on this thread have used the example of sin(90), probably expecting the argument units to be degrees rather than radians. There could be an alternate library using degrees: MathDeg::sin(90) # ==> 1.0 Another example might be a version of Math that used something other than libm, perhaps something with different precision, or optimized differently. The point is that the various math functions (or a particular implementation of them) belong together more than they belong to numbers.

on 2007-01-09 20:41

On 1/8/07, Daniel Finnie <danfinnie@optonline.net> wrote: > Why does everything have to be Math.<func>(num)? Isn't num.func more > object oriented-ish? Also, i forgot to mention, by including the module, you can make things look very similar to what you'd actually see in equations. >> include Math => Object >> 3 * sin(40) => 2.23533948143805

on 2007-01-10 00:32

Daniel Finnie wrote: > "acosh", "cos", "log10", "atan", "erf", "asinh", "sin", "sqrt", "cosh", > "erfc", "atanh"] >>> *5.sqrt* > => 2.23606797749979 >>> *Math.sqrt(5)* > => 2.23606797749979 >>> I have to say I'm very happy with that sort of things, as in a program of my own, (plotting scientific data), the user just can say ctioga --math 'sin(x)' to plot the sine of x. It would be confusing for a non rubyist to run ctioga --math 'x.sin' Wouldn't it ? Don't forget in this particular case, syntax can have impact on non-programming users... Cheers ! Vince

on 2007-09-25 22:29

Bil Kleb <Bil.Kleb@NASA.gov> writes: > Daniel Finnie wrote: >> Why does everything have to be Math.<func>(num)? Isn't num.func >> more object oriented-ish? > > That was one the first questions I had > when I came to the Ruby world. > > FWIW, here's a related answer from Matz, > > http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/... Hmpf. In my math textbook 1/2 != 0, and there's no such thing as a "zeroth" element. (I guess there is some complex tradition precidence at work.) :-) Steve

on 2007-09-25 22:31

On 1/10/07, Vidar Hokstad <vidar.hokstad@gmail.com> wrote: > There are inconsistencies that annoy me with Ruby, though, such as > Math.sin(x) but x.abs x.abs seems to me a convenience method. If you're using irb in math mode or something like this, this might make your functions look prettier: >> module Math >> def abs(x) >> x.send(:abs) >> end >> end => nil >> include Math => Object >> abs(10) => 10 >> abs(-10) => 10 >> abs(-10.2114125) => 10.2114125

on 2007-09-25 22:33

Hi, In message "Re: Why is there a seperate Math class?" on Tue, 9 Jan 2007 11:21:21 +0900, Daniel Finnie <danfinnie@optonline.net> writes: |I have to think this is the first time I've ever really disagreed with |matz and don't really understand his logic. Probably it's highly influenced by the languages we speak. Unfortunately, English is not the only language on Earth. |If I were to ask someone for the length of the word apples, I would say |"What is the length of apples?" In ruby, this would be "apples".length. I would say "apples no nagasa wa?" in Japanese (nagasa = length). |If I were to ask someone for the sine of, say, 90, I would say "What is |the sine of 90?" In ruby, this would be Math.sin(90) even though the |structure of the sentence is the same as for "apples" above. I would say "sin(90) wa?". See? It's different. ;-) Besides that, and far more importantly, Ruby honors UNIX math library (libm). All functions in Math module are found in libm. matz.

on 2007-09-25 22:34

Let me try to make everybody happy : class Numeric Math.methods(false).each { |m| sm = Math.method(m) if Math.method(m).arity == 1 define_method m do sm.call self end end } end irb(main):001:0> require 'math_extend' => true irb(main):002:0> 34.cos => -0.848570274784605 irb(main):003:0> Math.cos 34 => -0.848570274784605 Regards, Maël Clérambault

on 2007-09-25 22:38

Hi, In message "Re: Why is there a seperate Math class?" on Wed, 10 Jan 2007 07:52:15 +0900, Steven Lumos <steven@lumos.us> writes: |Hmpf. In my math textbook 1/2 != 0, and there's no such thing as a |"zeroth" element. (I guess there is some complex tradition precidence |at work.) Yep, try require 'mathn'. matz.

on 2007-09-25 22:38

"Erik Veenstra" <erikveen@gmail.com> writes: > Sin is an action _WITH_ 90. > >> even though the structure of the sentence is the same as for >> "apples" above. > > To me, it's not. > > gegroet, > Erik V. - http://www.erikveen.dds.nl/ > I tend to agree. Length can be interpreted as part of, or an attribute of the object (string) apples. Sin is an action in a class of mathematical operations which can operate on instances from a class of numbers. Tim

on 2007-09-25 22:40

On 1/9/07, William James <w_a_x_man@yahoo.com> wrote: > See the similarity? However, Ruby, a programming language, doesn't > need to emulate English. The way it's done now (sin(90), cos(90), etc.) makes sense because it's similar to the actual mathemathical notation I learned back in grade school. I find it easier to parse than 90.sin, especially when the argument is actually an expression rather than a constant number.

on 2007-09-25 22:40

MaÃ«l ClÃ©rambault <ml-ruby@clerama.be> writes: > } > MaÃ«l ClÃ©rambault > You gotta love it! A language which really does allow you to easily modify it to what you want it to look like and fit with houw yo want to think about the problem. Now nobody is right or wrong - its just a question of taste and individual thinking style. Tim

on 2007-09-25 22:40

> If I were to ask someone for the length of the word apples, I > would say "What is the length of apples?" In ruby, this would > be "apples".length. Length is a property _OF_ "apples". > If I were to ask someone for the sine of, say, 90, I would > say "What is the sine of 90?" In ruby, this would be > Math.sin(90) Sin is an action _WITH_ 90. > even though the structure of the sentence is the same as for > "apples" above. To me, it's not. gegroet, Erik V. - http://www.erikveen.dds.nl/

on 2007-09-25 22:41

Erik Veenstra wrote: > Sin is an action _WITH_ 90. Very crooked thinking. Consider %w( the ruby mafia strikes again ).sort Is 'sort' a property of %w( the ruby mafia strikes again ) ? > > > even though the structure of the sentence is the same as for > > "apples" above. > > To me, it's not. I'll help you out. Consider What is the zig of zag? What is the boo of hoo? See the similarity? However, Ruby, a programming language, doesn't need to emulate English.

on 2007-09-25 22:45

Hi -- On Tue, 9 Jan 2007, Gregory Brown wrote: > > but 90.sin * 10 looks as ugly as can be. The expression you're looking for is "ugly as sin" :-) David

on 2007-09-25 22:47

Daniel Finnie wrote: > Why does everything have to be Math.<func>(num)? Isn't num.func more > object oriented-ish? That was one the first questions I had when I came to the Ruby world. FWIW, here's a related answer from Matz, http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/... Regards,

on 2007-09-25 22:47

I have to think this is the first time I've ever really disagreed with matz and don't really understand his logic. If I were to ask someone for the length of the word apples, I would say "What is the length of apples?" In ruby, this would be "apples".length. If I were to ask someone for the sine of, say, 90, I would say "What is the sine of 90?" In ruby, this would be Math.sin(90) even though the structure of the sentence is the same as for "apples" above. Dan

on 2007-09-25 22:47

On 1/8/07, Daniel Finnie <danfinnie@optonline.net> wrote: > I have to think this is the first time I've ever really disagreed with > matz and don't really understand his logic. > > If I were to ask someone for the length of the word apples, I would say > "What is the length of apples?" In ruby, this would be "apples".length. > > If I were to ask someone for the sine of, say, 90, I would say "What is > the sine of 90?" In ruby, this would be Math.sin(90) even though the > structure of the sentence is the same as for "apples" above. but 90.sin * 10 looks as ugly as can be.

on 2007-09-25 22:52

Bira wrote: > The way it's done now (sin(90), cos(90), etc.) makes sense because > it's similar to the actual mathemathical notation I learned back in > grade school. I find it easier to parse than 90.sin, especially when > the argument is actually an expression rather than a constant number. Generally I find that I often prefer functional style over OO whenever the behavior of a method should only ever depend on basic properties of the public API of an object rather than internal details, don't need knowledge of the "real" class of an object, and don't have side effects. Most numerical method would fall in that category. There are inconsistencies that annoy me with Ruby, though, such as Math.sin(x) but x.abs Vidar