[#11822] RCR: Input XML support in the base Ruby — Dave Thomas <Dave@...>

15 messages 2001/03/01

[#11960] Not Ruby, for me, for the moment at least — "Michael Kreuzer" <mkreuzer@... (nospam)>

I wrote on this newsgroup last weekend about how I was considering using

11 messages 2001/03/04

[#12023] French RUG ? — "Jerome" <jeromg@...>

Hi fellow rubyers,

16 messages 2001/03/05

[#12103] disassembling and reassembling a hash — raja@... (Raja S.)

Given a hash, h1, will the following always hold?

20 messages 2001/03/06

[#12204] FEATURE REQUEST: 'my' local variables — Leo Razoumov <see_signature@127.0.0.1>

Ruby is, indeed, a very well designed language.

64 messages 2001/03/07
[#12250] Re: FEATURE REQUEST: 'my' local variables — Leo Razoumov <see_signature@127.0.0.1> 2001/03/07

>>>>> "GK" == GOTO Kentaro <gotoken@math.sci.hokudai.ac.jp> writes:

[#12284] Re: FEATURE REQUEST: 'my' local variables — gotoken@... (GOTO Kentaro) 2001/03/08

In message "[ruby-talk:12250] Re: FEATURE REQUEST: 'my' local variables"

[#12289] Re: FEATURE REQUEST: 'my' local variables — matz@... (Yukihiro Matsumoto) 2001/03/08

Hi,

[#12452] Re: FEATURE REQUEST: 'my' local variables — gotoken@... (GOTO Kentaro) 2001/03/12

In message "[ruby-talk:12289] Re: FEATURE REQUEST: 'my' local variables"

[#12553] Re: FEATURE REQUEST: 'my' local variables — Dave Thomas <Dave@...> 2001/03/13

matz@zetabits.com (Yukihiro Matsumoto) writes:

[#12329] Math package — Mathieu Bouchard <matju@...>

18 messages 2001/03/09

[#12330] Haskell goodies, RCR and challenge — Robert Feldt <feldt@...>

Hi,

19 messages 2001/03/09
[#12374] Re: Haskell goodies, RCR and challenge — matz@... (Yukihiro Matsumoto) 2001/03/10

Hi,

[#12349] Can Ruby-GTK display Gif Png or Jpeg files? — Phlip <phlip_cpp@...>

Ruby-san:

20 messages 2001/03/09

[#12444] class variables — Max Ischenko <max@...>

14 messages 2001/03/12

[#12606] Order, chaos, and change requests :) — Dave Thomas <Dave@...>

17 messages 2001/03/14

[#12635] email address regexp — "David Fung" <dfung@...>

i would like to locate probable email addresses in a bunch of text files,

12 messages 2001/03/14

[#12646] police warns you -- Perl is dangerous!! — Leo Razoumov <see_signature@127.0.0.1>

I just read this story on Slashdot

14 messages 2001/03/14
[#12651] Re: police warns you -- Perl is dangerous!! — pete@... (Pete Kernan) 2001/03/14

On 14 Mar 2001 11:46:35 -0800, Leo Razoumov <see_signature@127.0.0.1> wrote:

[#12691] Re: police warns you -- Perl is dangerous!! — "W. Kent Starr" <elderburn@...> 2001/03/15

On Wednesday 14 March 2001 15:40, Pete Kernan wrote:

[#12709] [OFFTOPIC] Re: police warns you -- Perl is dangerous!! — Stephen White <spwhite@...> 2001/03/16

On Fri, 16 Mar 2001, W. Kent Starr wrote:

[#12655] Re: FEATURE REQUEST: 'my' local variables — "Benjamin J. Tilly" <ben_tilly@...>

>===== Original Message From Leo Razoumov <see_signature@127.0.0.1> =====

18 messages 2001/03/14

[#12706] Library packaging — "Nathaniel Talbott" <ntalbott@...>

I have a project that I'm working on that needs to live two different lives,

30 messages 2001/03/16

[#12840] Looking for a decent compression scheme — Dave Thomas <Dave@...>

14 messages 2001/03/19

[#12895] differences between range and array — "Doug Edmunds" <dae_alt3@...>

This code comes from the online code examples for

16 messages 2001/03/20
[#12896] Re: differences between range and array — "Hee-Sob Park" <phasis@...> 2001/03/20

[#12899] Re: differences between range and array — Jim Freeze <jim@...> 2001/03/20

On Tue, 20 Mar 2001, Hee-Sob Park wrote:

[#12960] TextBox ListBox — Ron Jeffries <ronjeffries@...>

Attached is a little Spike that Chet and I are doing. It is a

13 messages 2001/03/20

[#12991] [ANN] Lapidary 0.2.0 — "Nathaniel Talbott" <ntalbott@...>

Well, here's my first major contribution to the Ruby world: Lapidary. It's a

16 messages 2001/03/20

[#13028] mkmf question — Luigi Ballabio <luigi.ballabio@...>

15 messages 2001/03/21

[#13185] Reading a file backwards — "Daniel Berger" <djberg96@...>

Hi all,

21 messages 2001/03/25
[#13197] Re: Reading a file backwards — "Daniel Berger" <djberg96@...> 2001/03/25

> Hi Dan,

[#13203] Re: Reading a file backwards — Mathieu Bouchard <matju@...> 2001/03/25

On Sun, 25 Mar 2001, Daniel Berger wrote:

[#13210] Re: Reading a file backwards — "Daniel Berger" <djberg96@...> 2001/03/25

"Mathieu Bouchard" <matju@sympatico.ca> wrote in message

[#13374] Passing an array to `exec'? — Lloyd Zusman <ljz@...>

I'd like to do the following:

15 messages 2001/03/31

[#13397] Multidimensional arrays and hashes? — Lloyd Zusman <ljz@...>

Is it possible in ruby to make use of constructs that correspond to

14 messages 2001/03/31

[ruby-talk:12594] Re: FEATURE REQUEST: 'my' local variables

From: Stephen White <spwhite@...>
Date: 2001-03-14 02:12:11 UTC
List: ruby-talk #12594
On Tue, 13 Mar 2001, Yukihiro Matsumoto wrote:

> The one is allowing explicit declaration of block local variables.
> <a,b|c,d> is one choice of notations.

One problem I can see with this is that it will make code harder to
modify. If I change the contents of a block, I will have to remember
to "declare" my usage in the <>'s. I kinda liked not having to define
my variables before using them.

> The other notation candidates may be special block form({{}}),

I already find the difference between do..end and {} to be confusingly
similar. One block type would be nicer, especially if it could remove
the difference between Proc objects and Method objects.

> and special declarative assignment.

This could be handled with a naming convention, and fits in with the
current design of Ruby...

  :name  is global in scope
  $name  is global in scope
  @@name is class in scope
  @name  is instance in scope
  _name  is block in scope

However, I'm not so sure this is the way to go either.

> The other idea is implicit propagation of variable scope, that is

In other words, a flattening of scope. I like this idea as it aligns
with not having nested methods. Eg, you can't do this:

  def method1
    def method1a
    end
    def method1b
    end
  end
  def method2
  end

I used nested procedures all the time when I was programming in Pascal
and found it very useful at the time. However, it has its problems and I
think things are better without them.

The same argument applies to nested variables in that they're useful, but
things are probably better without them.



*** start of loony tunes proposal ***

I would like to suggest that scoping rules be removed from do..end blocks
and stricter scoping rules be introduced for {} blocks.

Let's look at do..end first. Variables are accessible inside, and new
variables are available outside. This can be slightly extended so that
the parameters are shadowed, as follows:

  i = 123
  j = 10
  (1..10).each do |i|   # i becomes shadowed within the block
    j = i * 5
    k = i * 10
  end
  p [i, j, k]                  -> [123, 50, 100]

The "i" is protected because it's defined in the |i| parameter list. This
is a nice way of just using a name for the loop without trashing anything
else. All other variables are just there and used, like BASIC. :)

This also makes the following possible:

  i = 1000
  (101..103).each do |i|
    (1..3).each do |i|
      p i
    end
    p i
  end
  p i

  1 2 3 101 1 2 3 102 1 2 3 103 1000

So if someone really cares, they could list a few more variables in the
||'s (which would be empty since there's not enough parameters passed)
and achieve their local variables that way. Kludge? Yep! :)

{}'s are redefined to be the same as method definitions. They have their
own scope with no pre-existing variables accessible and no new variables
being accessible either. They both return a value.

Eg:

  i = 123
  j = 10
  (1..10).each {|i|
    # accessing j at this point would be an error
    j = i * 5
    k = i * 10
  }
  p [i, j, k]                  -> [123, 10, error]

Eg, no local variables are accessible inside of a {} block, and any
variables defined inside are not subsequently accessible, just as if
the code had been refactored into a separate method.

Now for one final tweak which will clean up another bit of Ruby as well.

Now that {}'s are the same as methods, it would be good to be able to do
the following:

  def jack(x) p x end  # as per normal

  jill = {|x| p x }    # storing code into a variable

  jack(10)          -> prints 10  # as per normal
  jill(20)          -> prints 20  # behaves exactly the same

  {|x| p x}(30)     -> prints 30  # orthogonality is great

thus making {}'s and "def method" exactly the same. The problem currently
in the way of this happening is that giving the name alone only returns the
Object handle when performing a call is more desirable.

The brute force way is to define a default method to be called when the
name is used. However, looking at what Ruby does...

  p a    # will silently call a.inspect
  puts a # will silently call a.to_s
  1 + a  # will silently call a.coerce

it makes much more sense to define the interpreter perform a call when
interpreting the code... in other words

  a      # will silently call a.exec

All of a sudden my classes become just as good as the built-in classes.

  class Fred
    attr_accessor :var
    def exec
      @var
    end
  end

  a = Fred.new.var 10       -> 10
  b = a + 20                -> 30
  c = 30 + a                -> 40

  a = Fred.new.var "12345"  -> "12345"
  b = a + "hello"           -> "12345hello"
  c = "world" + a           -> "world12345"

because the interpreter reads in the source, finds "a" by itself, and calls
the "exec" method automatically. I can hook in and define how I want this
variable to behave - in this case, acting exactly like @val.

This is something I can't do in Ruby at the moment, therefore my classes
will never be able to do as much as the built-in's.

In summary:

  do..end is the same as Proc objects, and has no scoping rules.

  {} is the same as Method, and has its own scope.

  The interpreter calls the "exec" method when the name alone is used.

On the downside, these changes are not backwards compatible. There's two
ways to go on this aspect...

  1) Introduce new syntax while phasing out old syntax.

  2) Introduce a version number that tells the interpreter how to handle
     the code, while giving warnings on old constructs.

I like the second option better, but can imagine it would be a headache
to program the interpreter to handle this.

Now from the big picture viewpoint, these changes make code easier to
refactor and modify. To add new code, I can use {}'s to make sure it
doesn't disturb any existing code. To move code out, I can enclose it
it in {}'s, treat it like a method, then move it out. The syntax stays
simple and things are conceptually more distinct.

What do you think? I like it. :)

-- 
  spwhite@chariot.net.au

In This Thread