[#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:9407] Re: 101 Misconceptions About Dynamic Languages

From: jstern@... (Josh Stern)
Date: 2001-01-17 04:40:03 UTC
List: ruby-talk #9407
Christoph Rippel <crippel@primenet.com> wrote:
>"Josh Stern" <jstern@foshay.citilink.com> wrote in message

>> As something of an exercise, I mentioned a possible strategy type
>overloading
>> in Ruby in some earlier messages:
>>
>> http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/8324
>> http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/8334

>Josh would you mind to give me to  1or 2 ``rubyish'' examples on
>how the Koenig lookup would work?

Koenig lookup is the system that C++ uses to resolve unqualified
function names, possibly as a function of the namespaces
where the arguments were declared.  When I wrote that, I was
thinking about Koenig lookup specifically, but also the general 
mechanism in C++ for resolving overloaded function calls 
according to arguments.  The Koening part was related to
some notion about freezing context, using mechanisms
like alias in Ruby. That goes against the grain of the dynamic 
nature of Ruby;  but the point of syntax errors in a compiled
language is to catch bugs at compile time, so it seemed
to me that it would be nice to catch all possible
syntax bugs in Ruby at method definition time.
But that is sort of secondary to the basic idea of
wanting some type checking.

So, let me reinterpret the question now as "How does overloading
functions by type work in C++?" and "How might it possibly
work in Ruby?"

The C++ algorithm for overload resolution of
obj.funcName(arg1,arg2) goes roughly something
like this (using a function of arity 2 to make
the example):

a) make a like of all methods for obj and its superclasses
named 'funcName' with arity 2.  

b) whittle down the list to include only those
methods where the type of the first argument
is the type of arg1 or a superclass of arg1 and
the type of the second argument is the type of arg2 
or a superclass of arg2.  If we now have the
empty list, then fail to compile.

c) if more than one method remains in the list, see if
there is one that dominates the others in the sense
that its first argument is at least as 'derived' as
the first argument of all the others and its second
argumet is at least as 'derived' as all the others
(a subclass is more derived than its superclass,
or other ancestors).  If there is no single dominant
method, then fail to compile.  Otherwise, the
remaining method is the unique choice.

There's a lot of other detail, most of which,
I think, is not relevant here (though allowing
arguments to have modes - e.g. const - is
a worthwhile topic in its own right).

In order to make sense of such a definition
in the Ruby context, it's necessary to extend
the partial order 'derived' to consider
methods defined in modules.  However, Ruby
has such an order that it uses for resolving
name clashes, so I think the same ordering
is appropriate here as well (a module's names take
priority over the names of a class that 
includes the module).

And 'fail to compile' translates as
raise an exception.

Hopefully, the describes a coherent rule.  But
there is the question of implementation.  
Ideally I would like to describe an implementation
algorithm in Ruby itself, starting with something along 
the lines of

class TypedMethodMaker
  def defineMethod(*args)
    if (args.length < 3)
      raise 'Usage: defineMethod(className,methName,argClass1,argClass2,...argClassN) \
       { | argName1, argName2,...,argNameN| ... }'
    else
      newProc = args.[args.length-1]
      if (newProc.kind_of?(Proc))
        numArg = newProc.arity

... and so forth for an auxilliary method definition routine.
the routine would check that there were no ordinary Ruby methods
with the name 'methName' that existed for className or any
super class or included module className - except special
wrapper methods (see below).  Then it would
store information in a bunch of nested maps 
that would later let one map an n-tuple of objects to a proc using
the algorithm above, or some variant of it, and call the
unique proc or else raise an exception.  The implementation would
also automatically build a special wrapper in the form of
a regular Ruby method methName (or perhaps methName
with a special suffix symbox appended like '|')
of className;  thw wrapper would check
arity and do the special overload resolution lookup.

Some things that I don't know how to do within Ruby itself are
the following:

1) look inside a proc object and make sure it is
coherently defined for the types in question

2) maintain the condition about no confliciting
ordinary Ruby methods as a dynamic invariant (this
would involve complicated hooks and method definitions
and module inclusions).

3) get the long number that represents the dynamic type
id of an object or the same for a class - this would
just be for efficiency instead of using long string
representations of the class

But all of those things could be done efficiently
in the Ruby interpreter.

-= Josh







In This Thread