[#8566] Visions for 2001/1.7.x development? — Robert Feldt <feldt@...>

Hi matz and other Ruby developers,

18 messages 2001/01/03
[#8645] Re: Visions for 2001/1.7.x development? — matz@... (Yukihiro Matsumoto) 2001/01/04

Hi,

[#8580] bug?? — jmichel@... (Jean Michel)

I don't understand the following behaviour:

19 messages 2001/01/03

[#8633] Interesting Language performance comparisons - Ruby, OCAML etc — "g forever" <g24ever@...>

13 messages 2001/01/04

[#8774] No :<, :>, etc. methods for Array — "Brian F. Feldman" <green@...>

So, why not include Comparable in Array by default? It shouldn't have any

28 messages 2001/01/07
[#8779] Re: No :<, :>, etc. methods for Array — matz@... (Yukihiro Matsumoto) 2001/01/07

Hi,

[#8780] Re: No :<, :>, etc. methods for Array — "Brian F. Feldman" <green@...> 2001/01/07

matz@zetabits.com (Yukihiro Matsumoto) wrote:

[#8781] Re: No :<, :>, etc. methods for Array — gotoken@... (GOTO Kentaro) 2001/01/07

In message "[ruby-talk:8780] Re: No :<, :>, etc. methods for Array"

[#8782] Re: No :<, :>, etc. methods for Array — "Brian F. Feldman" <green@...> 2001/01/07

gotoken@math.sci.hokudai.ac.jp (GOTO Kentaro) wrote:

[#8829] Sandbox (again) — wys@... (Clemens Wyss)

Hi,

20 messages 2001/01/08
[#8864] Re: Sandbox (again) — Clemens Hintze <c.hintze@...> 2001/01/08

On 8 Jan, Clemens Wyss wrote:

[#8931] String confusion — Anders Bengtsson <ndrsbngtssn@...>

Hello everyone,

21 messages 2001/01/09
[#8937] Re: String confusion — matz@... (Yukihiro Matsumoto) 2001/01/09

Hi,

[#8953] Please remove account from files — "Thomas Daniels" <westernporter@...>

Please take my e-mail address from your files and "CANCEL" my =

14 messages 2001/01/09
[#8983] Re: Please remove account from files — John Rubinubi <rubinubi@...> 2001/01/10

On Wed, 10 Jan 2001, Thomas Daniels wrote:

[#9020] time to divide -talk? (was: Please remove account from files) — Yasushi Shoji <yashi@...> 2001/01/10

At Wed, 10 Jan 2001 14:23:30 +0900,

[#9047] Re: time to divide -talk? (was: Please remov e account from files) — Aleksi Niemel<aleksi.niemela@...>

Yasushi Shoji:

27 messages 2001/01/10
[#9049] Re: time to divide -talk? — Yasushi Shoji <yashi@...> 2001/01/10

At Thu, 11 Jan 2001 00:20:45 +0900,

[#9153] what about this begin? — Anders Strandl Elkj誡 <ase@...> 2001/01/11

[#9195] Re: Redefining singleton methods — ts <decoux@...>

>>>>> "H" == Horst Duch=EAne?= <iso-8859-1> writes:

10 messages 2001/01/12

[#9242] polymorphism — Maurice Szmurlo <maurice@...>

hello

73 messages 2001/01/13

[#9279] Can ruby replace php? — Jim Freeze <jim@...>

When I read that ruby could be used to replace PHP I got really

15 messages 2001/01/14

[#9411] The Ruby Way — "Conrad Schneiker" <schneiker@...>

As a member of the "Big 8" newsgroups, "The Ruby Way" (of posting) is to

15 messages 2001/01/17

[#9462] Re: reading an entire file as a string — ts <decoux@...>

>>>>> "R" == Raja S <raja@cs.indiana.edu> writes:

35 messages 2001/01/17
[#9465] Re: reading an entire file as a string — Dave Thomas <Dave@...> 2001/01/17

raja@cs.indiana.edu (Raja S.) writes:

[#9521] Larry Wall INterview — ianm74@...

Larry was interviewed at the Perl/Ruby conference in Koyoto:

20 messages 2001/01/18
[#10583] Re: Larry Wall INterview — "greg strockbine" <gstrock@...> 2001/02/08

Larry Wall's interview is how I found out

[#9610] Re: 101 Misconceptions About Dynamic Languages — "Ben Tilly" <ben_tilly@...>

"Christian" <christians@syd.microforte.com.au> wrote:

13 messages 2001/01/20

[#9761] Re: 101 Misconceptions About Dynamic Languages — ts <decoux@...>

>>>>> "C" == Christoph Rippel <crippel@primenet.com> writes:

16 messages 2001/01/23

[#9792] Ruby 162 installer available — Dave Thomas <Dave@...>

15 messages 2001/01/24

[#9958] Re: Vim syntax files again. — "Conrad Schneiker" <schneik@...>

Hugh Sasse wrote:

14 messages 2001/01/26
[#10065] Re: Vim syntax files again. — Hugh Sasse Staff Elec Eng <hgs@...> 2001/01/29

On Sat, 27 Jan 2001, Conrad Schneiker wrote:

[#9975] line continuation — "David Ruby" <ruby_david@...>

can a ruby statement break into multiple lines?

18 messages 2001/01/27
[#9976] Re: line continuation — Michael Neumann <neumann@...> 2001/01/27

On Sat, 27 Jan 2001, David Ruby wrote:

[#9988] Re: line continuation — harryo@... (Harry Ohlsen) 2001/01/28

>A statement break into mutliple lines if it is not complete,

[ruby-talk:10024] Re: line continuation

From: "Brian F. Feldman" <green@...>
Date: 2001-01-28 15:13:14 UTC
List: ruby-talk #10024
Aleksi Niemel<zak@ale.cx> wrote:
> On Sun, 28 Jan 2001, Brian F. Feldman wrote:
> 
> > <ale@crimson.propagation.net> wrote:
> > > Anyway, this bug doesn't bite too often by accident. If you adopt
> > > "right" style to write code (include operator or dot as a hint of
> > > continuation to the same line) it's very rare event you need
> > > '\'. During my sufficiently short Ruby career I can't remember using
> > > this notation more than two times.
> > > 
> > > Usually when a statement grows over line there's something in your
> > > code which uses it's last way of signalling it should be fixed.
> > 
> > I disagree with that, since it is in the style of functional programming to 
> > have a large "chain" of methods acting upon a series of lists (or, in Ruby's 
> > case, Arrays).  For example:
> > 
> >     def CDDB.from_sql(res)
> >         unsubber = lambda {|s|
> >             s.scan(/[^\\]("([^"\\]|\\.)*")/).
> >               collect {|e| e[0][1..-2].gsub(/\\(.)/, '\1')}
> >         }
> >         CDDBStruct.new(unsubber.call(res[0]), res[1], unsubber.call(res[2]),
> >           res[3], unsubber.call(res[4]),
> >           res[5][1..-2].split(',').collect {|x| x.to_i})
> >     end
> > 
> > You'll probably see even longer chains than that all the time, and in those 
> > cases I think that when a statement is more than a line because of this, 
> > it's specifically doing things right!
> 
> While I agree with you that there's a certain tendency to produce
> chains of calls, I have to keep staying behind my opinion. My very
> argument against this style of coding is the fact that it's painful to
> read above code, and even more painful to change it.
> 

You think so?  My eyes, when following it, are drawn to the periods and the 
matching parentheses/braces/brackets.  In other words, my ... style? ... 
will often include more punctuation whereas yours will include whitespace 
because that's what really helps you visually pick out control flow.

> I like call chaining, even to the point I really like to get away with
> most method! anomalities (returning nil sometimes; actually I fixed
> one of these from someone else's code which didn't work for me).

Example (evil one, maybe :) from the same file:

        subber = lambda {|s|
            s.gsub!(/(\\*)\\n/) {$1.length[0] == 1 ? $1 + "\n" : $&}
            s.gsub!(/(\\*)\\t/) {$1.length[0] == 1 ? $1 + "\t" : $&}
            s.gsub!(/\\\\/, '\\')
            s.gsub!(/'/, "''")
            s.gsub!(/[{}]/, '\\\\\0')
            s
        }

It's not actually chained because I decided to use the bang-methods.  
I think that because every line lines up the same, it's a very clear idiom 
for performing a series of operations.  I'm not sure which I prefer.

Also, I notice that I tend to give ephemeral arguments one-letter names.  
How shell-scripty!

> Simultaneously when you reorganize the above code there's an effect
> that you give name to a thing you handle; be it a command chain,
> a parameter or a helper variable.
> 
>      def CDDB.from_sql(res)
>          quoted_string_re = /[^\\]("([^"\\]|\\.)*")/
>          unsubber = lambda do |s|
>              s.scan(quoted_string_re).collect do |e| 
>                  e[0][1..-2].gsub(/\\(.)/, '\1')}
>              end
>          end
>          listed_numbers = res[5][1..-2].split(',').collect {|x| x.to_i}
>          CDDBStruct.new(unsubber.call(res[0]), res[1],
>                         unsubber.call(res[2]), res[3], 
>                         unsubber.call(res[4]), listed_numbers)
>      end
> 
> I'm not claiming this example is in some way the ultimate, most
> readable version, but I find my version easier to read and mess
> around.

I'm one of those people that believe that if you're only using something 
once, it's usually wrong to give it a name unless otherwise it would truly 
make things very hard to follow.  In this specific case, I usually /try/ to 
let my regexps speak for themselves.  If they're so hard to follow that I 
can't tell what they're for, they're probably not very good at all :)  For 
instance, key to this one is it's "something in quotes not preceded by a 
backslash consisting of a series of strings that are either not a quote, not 
a backslash, or a backslash followed by anything".  This regexp, to me, is 
an important part of the code, so it should be read and understood like any 
of the rest.

I agree that using listed_numbers probably does make things that much easier 
to follow for a lot of people.  I was brought up on the BSD KNF style in C, 
which dictates (8-space) tabs for indentation but  four spaces for statement 
continuation.  I carry this to Ruby by using (4-space) tabs and 2-space 
statement continuation indentation, like in the CDDBStruct.new() call.  This 
is just the way I've been "raised": make the whitespace always mean 
something when it's there and always be consistent.  Something I forgot 
about in this case is at least attempting to make the lines more uniform, so 
I'd personally want to use something more like:

        CDDBStruct.new(unsubber.call(res[0]),
	  res[1], unsubber.call(res[2]),
          res[3], unsubber.call(res[4]),
          res[5][1..-2].split(',').collect {|x| x.to_i})

Uniformity makes it a bit more pleasing, but you're right that it can't be 
as uniform as it could when the arguments are all converted to a form which 
make lining up more possible.  I could go either way.

> Still I'd like to exploit the possible rule of "unsub every second
> parameter", name the mystical range of 1..-2, give better names to
> variables in unsubber, maybe split the long line of listed_numbers
> definition into two lines and call collect! on the latter.

I don't think that's a very good rule, because it's really just... 
coincidental:

    CDDBStruct = Struct.new('CDDB',
      :discid, :dtitle, :ttitle, :extd, :extt, :playorder)

Stored in SQL, it's:

... freedb (discid text[], dtitle text, ttitle text[],
  extd text, extt text[], playorder int[]);

The range 1..-2 will probably be seen an awful lot as the most common idiom 
for taking the "inside" of a string.  I can't think of any way to express it 
better :)  I still feel not giving things names until the end of a chain is 
a good thing.  For the listed_numbers, it's "take the sixth result, without 
the first and last characters, tokenize it by commas, and convert the array 
of strings to an array of integers".

> Anyway, I guess you get my point. I think it's quite rare event that
> you really have to have over 75 character (or some limit) lines. I
> hear the exceeding line length as a cry requesting some code massage.
> 
> There are some simple cases where the change is easy to do, like
> spreading inlined blocks to multiple lines ({..} notation to do..end),
> and with parameter passing I feel no guilty having couple of lines
> between opposing parentheses (as long as the content doesn't contain
> too much of executed code).
> 
> Do we still disagree ?)

It's a matter of style :)  I feel you raise a lot of good points, but I find 
my ethos on it to be different from yours.  So, I agree to disagree on parts 
of it, but I agree with you when you suggest that making things more 
"documentary" is useful.  Perhaps I should use comments some time...

P.S.: I just noticed that using Ruby for this kind of stuff rather than C, 
saying nothing about the amount of code needed, I never need any comments in 
the Ruby code to go back and understand any of it, but for C I always need 
to comment all manner of uncomplicated code.

-- 
 Brian Fundakowski Feldman           \  FreeBSD: The Power to Serve!  /
 green@FreeBSD.org                    `------------------------------'


In This Thread