[#18974] Perl/Python/Ruby common backend (Perl6) — ptkwt@...1.aracnet.com (Phil Tomson)

There is a thread about using .NET's CLR as a backend for Ruby, but how

17 messages 2001/08/01

[#19064] ANN: Code Amelioration Contest (presented by Ruby Conference 2001) — David Alan Black <dblack@...>

17 messages 2001/08/03
[#19184] Re: ANN: Code Amelioration Contest (presented by Ruby Conference 2001) — John Carter <john.carter@...> 2001/08/06

On Fri, 3 Aug 2001, David Alan Black wrote:

[#19185] Re: ANN: Code Amelioration Contest (presented by Ruby Conference 2001) — David Alan Black <dblack@...> 2001/08/06

Hello --

[#19186] Re: ANN: Code Amelioration Contest (presented by Ruby Conference 2001) — John Carter <john.carter@...> 2001/08/06

On Mon, 6 Aug 2001, David Alan Black wrote:

[#19125] My 1st look @ ruby: No prototypes and problem with String#gsub — stesch@... (Stefan Scholl)

My first ruby program:

23 messages 2001/08/04

[#19192] Some remarks from a nembie in Ruby — Renaud HEBERT <renaud.hebert@...>

After having read the book "Programming Ruby: The Pragmatic Programmer's

38 messages 2001/08/06

[#19269] Re: Perl/Python/Ruby common backend (Parrot, can Ruby play too?) — ptkwt@...1.aracnet.com (Phil Tomson)

In article <72X97.12093$9i1.972452@e420r-atl1.usenetserver.com>,

50 messages 2001/08/07
[#19349] Re: Perl/Python/Ruby common backend (Parrot, can Ruby play too?) — Mathieu Bouchard <matju@...> 2001/08/08

[#19456] Re: Perl/Python/Ruby common backend (Parrot, can Ruby play too?) — Harry Ohlsen <harryo@...> 2001/08/09

Ned Konz wrote:

[#19451] Re: Help! I'm still confused about threadin g in the ML — "Morris, Chris" <chris.morris@...>

> Is there an Outlook option to turn on In-Reply-To or References

14 messages 2001/08/09
[#19453] Re: Help! I'm still confused about threadin g in the ML — Dave Thomas <Dave@...> 2001/08/09

"Morris, Chris" <chris.morris@snelling.com> writes:

[#19506] the way class variables work — David Alan Black <dblack@...>

Hello --

51 messages 2001/08/10
[#19511] Re: the way class variables work — Chris Uzdavinis <chris@...> 2001/08/11

David Alan Black <dblack@candle.superlink.net> writes:

[#19524] order and freedom in Ruby (was: Re: Re: the way class variables work) — David Alan Black <dblack@...> 2001/08/11

Hello --

[#19517] Why not?: Assigning to self — furufuru@... (Ryo Furue)

Hi there,

55 messages 2001/08/11
[#19689] Re: Why not?: Assigning to self — Ron Jeffries <ronjeffries@...> 2001/08/14

On 13 Aug 2001 20:59:54 -0700, furufuru@ccsr.u-tokyo.ac.jp (Ryo Furue)

[#19694] Re: Why not?: Assigning to self — Ned Konz <ned@...> 2001/08/14

On Tuesday 14 August 2001 05:09 am, Ron Jeffries wrote:

[#19695] Re: Why not?: Assigning to self — ts <decoux@...> 2001/08/14

>>>>> "N" == Ned Konz <ned@bike-nomad.com> writes:

[#19696] Re: Why not?: Assigning to self — Ned Konz <ned@...> 2001/08/14

On Tuesday 14 August 2001 07:51 am, you wrote:

[#19697] Re: Why not?: Assigning to self — ts <decoux@...> 2001/08/14

>>>>> "N" == Ned Konz <ned@bike-nomad.com> writes:

[#19700] Re: Why not?: Assigning to self — Ned Konz <ned@...> 2001/08/14

On Tuesday 14 August 2001 08:27 am, you wrote:

[#19701] Re: Why not?: Assigning to self — ts <decoux@...> 2001/08/14

>>>>> "N" == Ned Konz <ned@bike-nomad.com> writes:

[#19703] Re: Why not?: Assigning to self — Ned Konz <ned@...> 2001/08/14

On Tuesday 14 August 2001 09:05 am, Guy Decoux wrote:

[#19704] Re: Why not?: Assigning to self — ts <decoux@...> 2001/08/14

>>>>> "N" == Ned Konz <ned@bike-nomad.com> writes:

[#19708] Re: Why not?: Assigning to self — Ned Konz <ned@...> 2001/08/14

On Tuesday 14 August 2001 09:27 am, you wrote:

[#19709] Re: Why not?: Assigning to self — ts <decoux@...> 2001/08/14

>>>>> "N" == Ned Konz <ned@bike-nomad.com> writes:

[#19713] Re: Why not?: Assigning to self — Ned Konz <ned@...> 2001/08/14

On Tuesday 14 August 2001 09:45 am, you wrote:

[#19750] Re: Why not?: Assigning to self — matz@... (Yukihiro Matsumoto) 2001/08/15

Hi,

[#19819] Re: Why not?: Assigning to self — Ned Konz <ned@...> 2001/08/15

On Tuesday 14 August 2001 08:14 pm, matz wrote:

[#19852] Re: Why not?: Assigning to self — matz@... (Yukihiro Matsumoto) 2001/08/16

Hi,

[#19857] Re: Why not?: Assigning to self — "Florian G. Pflug" <fgp@...> 2001/08/16

On Thu, Aug 16, 2001 at 11:05:59AM +0900, Yukihiro Matsumoto wrote:

[#19858] Re: Why not?: Assigning to self — matz@... (Yukihiro Matsumoto) 2001/08/16

Hi,

[#19867] Re: Why not?: Assigning to self — "Pit Capitain" <pit@...> 2001/08/16

Just a followup at (my) current end of the thread:

[#19550] Forced garbage collection — Lars Christensen <larsch@...>

14 messages 2001/08/11
[#19562] Re: Forced garbage collection — "Nat Pryce" <nat.pryce@...13media.com> 2001/08/12

From: "Lars Christensen" <larsch@cs.auc.dk>

[#19551] /.ed again — Tobias Reif <tobiasreif@...>

Ruy gets slasdotted again ;)

19 messages 2001/08/11

[#19650] Ruby Newbie mailing list — Michael Pence <mikepence@...>

Hello all.

14 messages 2001/08/13
[#19656] RE: Ruby Newbie mailing list — "Louis Brothers" <lcb134@...> 2001/08/13

We had a similar discussion on the OmniWeb Objective-C mailing list not to

[#19659] Re: Ruby Newbie mailing list — Michael Pence <mikepence@...> 2001/08/13

I appreciate your references to Objectionable-C ;-)

[#19685] Compiling Ruby with cygwin and Tk support — Manuel Zabelt <ng@...>

Hello!

13 messages 2001/08/14

[#19718] General (GUI/license) questions — Ryan Tarpine <rtarpine@...>

First: Kero commented in the description of his new Ruby Agenda program

18 messages 2001/08/14

[#19755] "new" returning nil: how to report the failure of object creation — furufuru@... (Ryo Furue)

Hi there,

14 messages 2001/08/15

[#19758] The GUI poll is in, and the results are surprising — Dave Thomas <Dave@...>

40 messages 2001/08/15
[#19774] Re: The GUI poll is in, and the results are surprising — Lars Christensen <larsch@...> 2001/08/15

On Wed, 15 Aug 2001, Dave Thomas wrote:

[#19784] Re: The GUI poll is in, and the results aresurprising — "Lyle Johnson" <ljohnson@...> 2001/08/15

> Please don't forget what Ruby is all about in this discussion! I think

[#19824] Ruby GUI — "Hal E. Fulton" <hal9000@...>

The concept of a new GUI is somewhat appealing,

16 messages 2001/08/15

[#20033] Ruby Article — Joshua Drake <jd.nospam@...>

Hello,

38 messages 2001/08/20

[#20127] Another Possible RCR - Wrappers via Mixins — Stephen White <spwhite@...>

The main difference between mix-ins and multiple inheritence is (to my understanding) that parent classes do not call child code, but mix-ins do.

15 messages 2001/08/22

[#20135] Bruce Eckel's criticism of Ruby — Ned Konz <ned@...>

Python.org links to http://www.mindview.net/Etc/notes.html#Ruby , saying

24 messages 2001/08/22

[#20183] ++ Operator — kamphausen@... (SKa)

Dear Community,

35 messages 2001/08/23
[#20234] Re: ++ Operator — Dave Thomas <Dave@...> 2001/08/24

matz@ruby-lang.org (Yukihiro Matsumoto) writes:

[#20236] Re: ++ Operator — matz@... (Yukihiro Matsumoto) 2001/08/24

Hi,

[#20209] In Ruby 0 is true but nil is false.. or how to shoot yourself?.. — Guillaume Cottenceau <gc@...>

I have a simple Audio-CD database (using CSV format). I was writing a

11 messages 2001/08/23

[#20254] File.readline(s) — Michael Husmann <michael.husmann@...>

I am reading a 55MB ASCII file by using File.readline(s) which takes on

14 messages 2001/08/24

[#20303] New Windows InstallShield version of Ruby — Andrew Hunt <andy@...>

19 messages 2001/08/24

[#20307] Backwards language — "Sean Middleditch" <elanthis@...>

Greetings,

30 messages 2001/08/24

[ruby-talk:20469] Re: recursive lambda forms

From: jweirich@...
Date: 2001-08-28 12:13:27 UTC
List: ruby-talk #20469
>>>>> "Alexander" == Alexander Schofield <theschof@cs.com> writes:

    Alexander> It occurs to me that being able to create recursive
    Alexander> lambda forms should be possible in any language where a
    Alexander> method is an object.  Just as "self", refers to the
    Alexander> object a method belongs to, shouldn't there be a
    Alexander> reserved word (or optional argument specified with
    Alexander> different syntax, maybe %?) for the Method or Proc
    Alexander> object itself?  This way a method could call itself
    Alexander> without knowing in advance what it was going to be
    Alexander> called.

    Alexander> Aside from defining a named method and creating a
    Alexander> reference to it, is there any already existing way to
    Alexander> do what I'm think of?

This isn't exactly what you want, but it reminds me of a "problem"
involving a Y-Combinator.  This was a fun puzzle, so I'll post it here
for entertainment purposes only.

The Y-Combinator "solves" the problem of recursive anonymous lambda
functions (proc's), with the additional constraint that lamdba binding
is the only way to associate values and names.  In other words,
assignments are not allowed.

If assignments are allowed, a recursive version of factorial can be
done like this ...

fact = proc { |n|
  if n == 0
     1
  else
     fact.call(n-1)
  end
}

If we using only lambda binding, then we would have to write something
like

proc { |fact|
  proc { |n|
    if n == 0
      1
    else
      fact.call(n-1)
    end
  }
}

where "fact" is bound to the factorial function.  Unfortunately, it
seems we have a chicken and egg problem because the factorial function
is exactly what we are trying to write in the first place.

The Y-combinator will take the above form and turn it into a real
factorial without infinite recursion or exploding (just kidding about
the exploding part).

The following code will demonstrates the Y-combinator written in Ruby.
If this hurts your head, you should see the version done in Java using
inner classes!

######################################################################
# Program: Y
# Purpose: Demonstrate the Y-Combinator in Ruby
# Author:  Jim Weirich
# Why:     Because everybody else was doing it in Perl and I wanted
#          to be different.
# Usage:   java Y `number'
#
# Discussion:
#
# The Y-Combinator is a way of using lambda calculus to bind
# functions to names for recursive calling.  Its purpose is to
# demonstrate that Lambda calculus is theoritically sufficient for
# all compuational processes.
#
# I used the definition of the Y-Combinator from Friedman's "The
# Little Schemer", page 172.  He defines it (in Scheme of course) as:
#
# (define Y
#   (lambda (le)
#    ((lambda (f) (f f))
#     (lambda (f)
#       (le (lambda (x) ((f f) x))) ) ) ) )
#
# Y takes an argument that is a function generator.  To use Y, just
# define a function that takes an function as an argument and then
# codes the recursive definition using the argument.  For example,
# the recursive factorial function generator could be defined ...
#
# (define F
#   (lambda (proc)
#     (lambda (n)
#       (if (zero? n)
#	     1
#	     (* n (proc (- n 1))) ))))
#
# In order to calculate the factorial of 5, you would invoke:
#
#     ((Y F) 5)
#
# A fully expanded Y-Combinator/Function-generator expression would
# look like:
#
#      (((lambda (le)
# 	   ((lambda (f) (f f))
# 	    (lambda (f)
# 	      (le (lambda (x) ((f f) x))) ) ) )
# 	 (lambda (proc)
# 	   (lambda (n)
# 	     (if (zero? n)
# 		 1
# 		 (* n (proc (- n 1))) ))) ) 5)
#
# Evaluating the above expression yields: 120
#
# Translation to Ruby
# -------------------
#
# The following Ruby program is a fairly straightforward translation
# of the above Scheme expressions.  We shall use proc's as the Ruby
# version of lambda expressions.  
#
# The following bit of code creates a lambda function that adds 1 to
# its argument and applies the newly created function to the number 5:
#
#    proc {|arg| arg+1}.call(5)
#
# Scheme Equivalent:
#    ((lambda (arg) (+ arg 1)) 5)
#
# The following calculates the factorial of the command line argument
# using only Lambda functions.
#
# Are you ready?  First, we will do it the easy way, using Y to hold
# the combinator expression and F to hold the factorial proto
# function.
# --------------------------------------------------------------------

F = proc { |recurse|
  proc { |n|
    if n == 0 then
      1
    else
      n * recurse.call (n-1)
    end
  }
}

Y = proc { |builder|
  proc { |f| f.call(f) } \
  .call ( proc { |f|
	   builder.call (proc { |x| f.call(f).call(x) }) })
}

p Y.call(F).call(5)		# prints "120"

# --------------------------------------------------------------------
# Now the hard way, in a single expression without any free variables.
# This is the same as the above expression, except that we have
# explicitly replaced the variables Y and F with their expressions.
# --------------------------------------------------------------------

p proc { |le|
  proc { |f| f.call(f) } \
  .call ( proc { |f|
	   le.call (proc { |x| f.call(f).call(x) }) })
}.call(proc { |recurse|
  proc { |n|
    if n == 0 then
      1
    else
      n * recurse.call (n-1)
    end
  }
}).call(5)			# prints "120"


-- 
-- Jim Weirich     jweirich@one.net    http://w3.one.net/~jweirich
---------------------------------------------------------------------
"Beware of bugs in the above code; I have only proved it correct, 
not tried it." -- Donald Knuth (in a memo to Peter van Emde Boas)

In This Thread