[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Lambda funcs that call gets won't halt program execution?

Peter Bunyan

12/5/2007 10:30:00 PM

Once again, a problem with my Befunge interpreter. I'm trying to
implement the ~ and & functions - get a character and a number,
respectively. My & function looks like this:
instructions["&"] = lambda { print "Number: "; stack.push
gets().strip.to_i}

But it complains about gets() being nil. as soon as the function is run.
Well, of course it is. It has let me type. Is there anyway to make it
halt?

Why does Ruby keep picking on me? Oh, wait. The principle of least
surprise - all programming languages infuriate me, therefore it would
surprise me least if Ruby did too. :)

Attachments:
http://www.ruby-...attachment/1108/...

--
Posted via http://www.ruby-....

5 Answers

Tomas Pospisek

12/5/2007 10:53:00 PM

0

On Thu, 6 Dec 2007, Peter Bunyan wrote:

> Once again, a problem with my Befunge interpreter. I'm trying to
> implement the ~ and & functions - get a character and a number,
> respectively. My & function looks like this:
> instructions["&"] = lambda { print "Number: "; stack.push
> gets().strip.to_i}
>
> But it complains about gets() being nil. as soon as the function is run.
> Well, of course it is. It has let me type. Is there anyway to make it
> halt?

This works for me:

i= {}
s= []
i["&"] = lambda {
print "Number: "
s.push( gets().strip.to_i ) }

i['&'].call
puts "Evaluating stack: #{s.pop}"

Gives:

-> Number:
123
-> Evaluating stack: 123

*t

--
-----------------------------------------------------------
Tomas Pospisek
http://sour... - Linux & Open Source Solutions
-----------------------------------------------------------

Morton Goldberg

12/6/2007 3:26:00 AM

0

On Dec 5, 2007, at 5:52 PM, Tomas Pospisek's Mailing Lists wrote:

> On Thu, 6 Dec 2007, Peter Bunyan wrote:
>
>> Once again, a problem with my Befunge interpreter. I'm trying to
>> implement the ~ and & functions - get a character and a number,
>> respectively. My & function looks like this:
>> instructions["&"] = lambda { print "Number: "; stack.push
>> gets().strip.to_i}
>>
>> But it complains about gets() being nil. as soon as the function
>> is run.
>> Well, of course it is. It has let me type. Is there anyway to make it
>> halt?
>
> This works for me:
>
> i= {}
> s= []
> i["&"] = lambda {
> print "Number: "
> s.push( gets().strip.to_i ) }
>
> i['&'].call
> puts "Evaluating stack: #{s.pop}"
>
> Gives:
>
> -> Number:
> 123
> -> Evaluating stack: 123

And this very similar code works just fine for me.

<code test.rb>
#! /usr/bin/env ruby -w
$stack = []
$instructions = {}
instructions = $instructions
stack = $stack
require "xtest"
instructions["&"].call
p stack
</code>

<code xtest.rb>
instructions = $instructions
stack = $stack
instructions["+"] = lambda { |a, b| stack.push(a + b) }
instructions["-"] = lambda { |a, b| stack.push(b - a) }
instructions["&"] = lambda { print("Number: "); stack.push
(gets.chomp.to_i) }
</code>

So I wonder: what in your code that you are _not_ showing us is
messing you up?

Regards, Morton

William James

12/6/2007 9:16:00 AM

0

On Dec 5, 4:30 pm, Peter Bunyan <peter.bun...@gmail.com> wrote:
> Once again, a problem with my Befunge interpreter. I'm trying to
> implement the ~ and & functions - get a character and a number,
> respectively. My & function looks like this:
> instructions["&"] = lambda { print "Number: "; stack.push
> gets().strip.to_i}
>
> But it complains about gets() being nil. as soon as the function is run.
> Well, of course it is. It has let me type. Is there anyway to make it
> halt?

If Ruby is invoked in this fashion
ruby myprog.rb myfile
then gets reads from the file.
You need
$stdin.gets

Peter Bunyan

12/6/2007 8:58:00 PM

0

> You need $stdin.gets

William, you're a brilliant person. You win. You're wintastic, in fact.
--
Posted via http://www.ruby-....

William James

12/6/2007 9:08:00 PM

0

On Dec 6, 2:57 pm, Peter Bunyan <peter.bun...@gmail.com> wrote:
> > You need $stdin.gets
>
> William, you're a brilliant person. You win. You're wintastic, in fact.
> --
> Posted viahttp://www.ruby-....

I've scratched my head because of this behavior, too.
It's amazing how something so obvious can cause so
much puzzlement.