From: Mathieu Bouchard Date: 2005-01-07T02:22:16+09:00 Subject: Re: Allowing custom number literal suffixes? On Wed, 5 Jan 2005, Florian Gro� wrote: > Mathieu Bouchard wrote: > > On Tue, 4 Jan 2005, Florian Gro� wrote: > > limiting? how so? can you elaborate on this? > I think an "i" suffix is more natural for imaginary numbers than "I", > for example. Mathematica uses uppercase I for imaginary, and is by far the most used algebraic manipulation software. I think a lot of mathematicians got used to it. However, in Mathematica (AFAIK): I is a global variable, defined to have "no value" (this is not possible in Ruby) but only the substitution rule that I*I=-1 (Ruby doesn't have that feature either). In Ruby, the closest that can be done is I=Complex(0,1). f x means f*x, and function calls have to be written like f[x]. I think even f(x) means f*x (really). So I think it is important to be a bit more laidback in imitating the conventions of classic math. If mathematicians had always been that conservative, we would not even have the plus sign nowadays (which was invented in 1540-something). Mathematica breaks a whole lot of common notations because it is understood that those notations are optimised for the handwriting of proofs, and become rather annoying in computer programs (e.g. LaTeX or LyX) and... I've seen '70s/'80s math textbooks written with typewriters. They're a hell to read, can't imagine the hell they are to write. > But I have to admit that this is not all that important. But it's important to realise that it's not important, which is why I take the time to write about it! :-) > I guess my hesitancy to using regular Kernel methods is mostly based on > other factors. While you were able to omit the parentheses in some of > your examples rendering the syntax as R"0.5" which is already quite > acceptable that will not work in general, R"0.5" + 0.5 would not work, > for example and R("0.5") is and looks like a global method call. Using my example's notation it would be Q(1,2), where Q is exactly just an alias for Rational, and so it accepts only a pair of Integers, and not a stringified float, for two reasons: Using double-quotes is useless and cumbersome for cases where the unquoted syntax is already valid (such as writing 1, writing 2, and writing 0.5) Using float syntax for rationals is ugly and borders on nonsense... (and i repeat myself) So the example R"0.5" + 0.5 is not appropriate. Please find another example instead... > I'm not feeling well about having these functions that would only be > used for number literal like usage anyway in the Kernel where they would > appear in line with other methods like "puts" and "caller". Well, then, define them in another module and include that module whereever you need it!!! You know, if my solutions look bad to you, but have obvious fixes, you don't need to concentrate on my bad solutions, you can improve my solutions and make them your own! > Don't you feel bad explaining to a newcomer that that R() method that > is reachable from all Objects is something the standard library > defines to allow for easier constructing of Rationals? No, because by then, I would have made it clear that I do not endorse all of Ruby's features, and that I use Ruby for its advantages, not its inconvenients. If I wanted a programming language that is free of inconvenients or embarrassments, I would not use Ruby. This is the kind of wisdom I learned from a Perl programmer. His name is Larry Wall and he writes lots of useful articles. However Perl's got a bad reputation, so a lot of people never get to learn from him what one wouldn't learn from anyone else. For example, Dave Thomas is no more a replacement for Larry Wall than Larry Wall is a replacement for Dave Thomas: if I were asked which one I like better, I'd answer "both". I wouldn't feel bad explaining R() to a newcomer. I would downplay the importance of that fact, because I think it would be a fact that deserves to be downplayed. However the two things I have terrible trouble explaining to newcomers and/or outsiders, are: a Module is the same as a Class, except when it's not. Multiple inheritance is not called multiple, and several words are used just to avoid saying "inherit from". there are things (blocks) that are 100% like Procs except they are not objects (blocks). The & argument of a method is magical and can only contain either a proc or nil. You can only have one block in a call, so that if you want more, you have to use procs instead, with a different syntax. > I'm certain that lots of Ruby's users would not be willing to do that > for the sake of less typing. And while I can not say that > "number_literal_R" is immediately obvious it explains its purpose > already way better than a single letter method name ever could. That's because you inserted the comment inside the method name. I won't be fooled by this one. What you want to do is use the parser so that you can have a long, descriptive method-name in the def but a short one (the suffix) when making a call. > I think it would also be a good idea to move it to Numeric.literal_R > just so it does not clobber up all Objects. You mean "clutter" and not "clobber". > I also have a hard time seeing the syntax pollution you talked about > in on of your earlier postings. [...] > I just wonder why you seem to be against this so intensively -- is it > the "Say no by default" mentality to avoid unnecessary language > complexity or are there other reasons? Well, yeah, it's just that i'd rather not add any more rules to Ruby's syntax, as it's already quite complex as it is, especially if there are already good enough solutions elsewhere. Of course, solutions good enough for me are not necessarily so for other people. :-/ _____________________________________________________________________ Mathieu Bouchard -=- Montr�al QC Canada -=- http://artengine.ca/matju