Quit, if a specific key is hit

Excuse me, if this is already discussed... but from from here <http://www.rubyrailways.com/implementing-15-exercises-for-learning-a-new-programming-language/>.. the author concludes that the following problem cannot be solved.. whats the reason?
"Display series of numbers (1,2,3,4, 5....etc) in an infinite loop. The program should quit if someone hits a specific key (Say ESCAPE key)."

···

--
Regards,
Pavankumar Kulkarni * Software Developer * Persistent Systems Ltd

It can definitely be solved. Here's a solution that works on most Unix-like operating systems, for example:

   #!/usr/bin/env ruby -wKU

   require "io/wait"

   state = `stty -g`
   begin
     system "stty raw -echo cbreak isig"

     1.upto(1.0/0.0) do |n|
       puts n
       exit if $stdin.ready? and $stdin.getc == 27
     end

   ensure
     system "stty #{state}"
   end

   __END__

What the author actually said was that it can't solve it without writing some platform specific code or threads. I don't know how to do it without using one of those tricks either.

The reason is that all terminals are different and you are needing to interact with it on two levels at once (reading while writing). This is what introduces the need for the platform specific code.

James Edward Gray II

···

On Jan 16, 2008, at 11:43 PM, Pavankumar Kulkarni wrote:

Excuse me, if this is already discussed... but from from here <http://www.rubyrailways.com/implementing-15-exercises-for-learning-a-new-programming-language/&gt;\.\. the author concludes that the following problem cannot be solved.. whats the reason?
"Display series of numbers (1,2,3,4, 5....etc) in an infinite loop. The program should quit if someone hits a specific key (Say ESCAPE key)."

In many of the game libraries, input for different platforms is addressed.
This one of those cases where the game libraries, such as Gosu or rubygame, or Ruby/SDL are going to be very useful for a non game.
most game libs have a very fundamental need for input control, and a pretty important need for crossplatform code abstraction.
You don't need to know much about them, just enough to get the keys under your control!
But the plus is, you can also get a GUI up without much work.

···

On Jan 17, 2008, at 7:28 AM, James Gray wrote:

On Jan 16, 2008, at 11:43 PM, Pavankumar Kulkarni wrote:

Excuse me, if this is already discussed... but from from here <http://www.rubyrailways.com/implementing-15-exercises-for-learning-a-new-programming-language/&gt;\.\. the author concludes that the following problem cannot be solved.. whats the reason?
"Display series of numbers (1,2,3,4, 5....etc) in an infinite loop. The program should quit if someone hits a specific key (Say ESCAPE key)."

It can definitely be solved. Here's a solution that works on most Unix-like operating systems, for example:

  #!/usr/bin/env ruby -wKU

  require "io/wait"

  state = `stty -g`
  begin
    system "stty raw -echo cbreak isig"

    1.upto(1.0/0.0) do |n|
      puts n
      exit if $stdin.ready? and $stdin.getc == 27
    end

  ensure
    system "stty #{state}"
  end

  __END__

What the author actually said was that it can't solve it without writing some platform specific code or threads. I don't know how to do it without using one of those tricks either.

The reason is that all terminals are different and you are needing to interact with it on two levels at once (reading while writing). This is what introduces the need for the platform specific code.

James Edward Gray II

Cool.. that clears some air!.. Cheers guys!!..
Hail Ruby Community!! :slight_smile:

···

--
Pavan Software Developer Persistent Systems Ltd, Goa, India

John Joyce wrote:

On Jan 17, 2008, at 7:28 AM, James Gray wrote:

On Jan 16, 2008, at 11:43 PM, Pavankumar Kulkarni wrote:

Excuse me, if this is already discussed... but from from here <http://www.rubyrailways.com/implementing-15-exercises-for-learning-a-new-programming-language/&gt;\.\. the author concludes that the following problem cannot be solved.. whats the reason?
"Display series of numbers (1,2,3,4, 5....etc) in an infinite loop. The program should quit if someone hits a specific key (Say ESCAPE key)."

It can definitely be solved. Here's a solution that works on most Unix-like operating systems, for example:

  #!/usr/bin/env ruby -wKU

  require "io/wait"

  state = `stty -g`
  begin
    system "stty raw -echo cbreak isig"

    1.upto(1.0/0.0) do |n|
      puts n
      exit if $stdin.ready? and $stdin.getc == 27
    end

  ensure
    system "stty #{state}"
  end

  __END__

What the author actually said was that it can't solve it without writing some platform specific code or threads. I don't know how to do it without using one of those tricks either.

The reason is that all terminals are different and you are needing to interact with it on two levels at once (reading while writing). This is what introduces the need for the platform specific code.

James Edward Gray II

In many of the game libraries, input for different platforms is addressed.
This one of those cases where the game libraries, such as Gosu or rubygame, or Ruby/SDL are going to be very useful for a non game.
most game libs have a very fundamental need for input control, and a pretty important need for crossplatform code abstraction.
You don't need to know much about them, just enough to get the keys under your control!
But the plus is, you can also get a GUI up without much work.

I found a platform independent solution to this in one of the comments of that link(below) here <http://www.rubyrailways.com/implementing-15-exercises-for-learning-a-new-programming-language/#comment-1145&gt;\.

i=0
loop do
begin
break if STDIN.read_nonblock(1000)
rescue Errno::EAGAIN
end
puts i
i += 1
end

Cheers,
Pavankumar Kulkarni * Software Developer * Persistent Systems Ltd

John Joyce wrote:

···

On Jan 17, 2008, at 7:28 AM, James Gray wrote:

On Jan 16, 2008, at 11:43 PM, Pavankumar Kulkarni wrote:

Excuse me, if this is already discussed... but from from here <http://www.rubyrailways.com/implementing-15-exercises-for-learning-a-new-programming-language/&gt;\.\. the author concludes that the following problem cannot be solved.. whats the reason?
"Display series of numbers (1,2,3,4, 5....etc) in an infinite loop. The program should quit if someone hits a specific key (Say ESCAPE key)."

It can definitely be solved. Here's a solution that works on most Unix-like operating systems, for example:

  #!/usr/bin/env ruby -wKU

  require "io/wait"

  state = `stty -g`
  begin
    system "stty raw -echo cbreak isig"

    1.upto(1.0/0.0) do |n|
      puts n
      exit if $stdin.ready? and $stdin.getc == 27
    end

  ensure
    system "stty #{state}"
  end

  __END__

What the author actually said was that it can't solve it without writing some platform specific code or threads. I don't know how to do it without using one of those tricks either.

The reason is that all terminals are different and you are needing to interact with it on two levels at once (reading while writing). This is what introduces the need for the platform specific code.

James Edward Gray II

In many of the game libraries, input for different platforms is addressed.
This one of those cases where the game libraries, such as Gosu or rubygame, or Ruby/SDL are going to be very useful for a non game.
most game libs have a very fundamental need for input control, and a pretty important need for crossplatform code abstraction.
You don't need to know much about them, just enough to get the keys under your control!
But the plus is, you can also get a GUI up without much work.

I could be wrong, but I was under the impression that _all_ Errnos
were platform-dependant.

Daniel Brumbaugh Keeney

···

On Jan 18, 2008 4:19 AM, Pavankumar Kulkarni wrote:

I found a platform independent solution to this in one of the comments
of that link(below) here
<http://www.rubyrailways.com/implementing-15-exercises-for-learning-a-new-programming-language/#comment-1145&gt;\.
rescue Errno::EAGAIN

I found a platform independent solution to this in one of the comments
of that link(below) here
<http://www.rubyrailways.com/implementing-15-exercises-for-learning-a-new-programming-language/#comment-1145&gt;\.

That does not fulfill the stated requirements, does it?

i=0
loop do
begin
break if STDIN.read_nonblock(1000)

C defines stdin to be buffered, so characters will pile up in the
buffer until an EOL is seen or the buffer is full. It might be the
case that some platform does not do this, but in general the program
won't stop until you press a lot of keys or (usually), press enter.

Marcelo

···

On Jan 18, 2008 4:19 AM, Pavankumar Kulkarni <pavankumar_kulkarni@persistent.co.in> wrote: