Thanks for the response. I really don't have to handle every incoming
response. I put in the line you suggested, and it did indeed identify a
number of commands that are "unknown". But that's ok, as far as I can tell.

As for "if" vs. "case", in my real program, I did something even more
general:
https://github.com/arwagner/tdchess/blob/master/lib/tdchess/runner.rb .
This lets you plug in any command handlers you want. I plan on having a
library of handlers for different commands, maybe a nice DSL or something
for creating new ones, etc. Obviously, I shortened all of that to isolate
this problem.


On Fri, Mar 15, 2013 at 7:57 PM, Garthy D <
garthy_lmkltybr / entropicsoftware.com> wrote:

> Hi Andrew,
>
>
> On 16/03/13 09:04, Andrew Wagner wrote:
>
>> All,
>> I'm writing a chess program that has a simple text-based interface. It's
>> designed to be run by another program, which has a nice UI. Here's the
>> program as it stands now, whittled to the simplest possible use case:
>>
>> i = 0
>> moves = ["a7a6","a6a5","a5a4","a4a3"]
>> $stdin.each do |command|
>>    if command.start_with?("protover"**)
>>      $stdout.puts "feature ping=0 setboard=1 ics=1 usermove=1"
>>    elsif command.start_with?("usermove"**)
>>      $stdout.puts "move #{moves[i]}"
>>      i+=1
>>    end
>>    $stdout.flush
>> end
>>
>> The "protover" thing is needed to tell the UI program how to initialize
>> the protocol, and then every time a move is made, the UI program sends
>> "usermove <some move>" to my program, which responds with "move <my
>> move>".
>>
>> If I run this by itself, I can happily enter a few 'usermove' commands
>> manually, and get any number of canned moves back. However, when I run
>> this under the UI, I get an Interrupt:
>>
>> bin/winboard.rb:3:in `each': Interrupt
>> from bin/winboard.rb:3:in `<main>'
>>
>> I know that the UI program is pretty reliable, so I'm missing something
>> in the way that I'm handling IO buffering or something. If you want the
>> nitty gritty details, you can see them at
>> http://www.gnu.org/software/**xboard/engine-intf.html<http://www.gnu.org/software/xboard/engine-intf.html>. I'm running on
>> MacOSX. Any suggestions?
>>
>
> Is it possible that you aren't processing one of the commands from the
> program, and the program is terminating your script, perhaps after a
> timeout or incorrect response? I'm wondering what would show up if you
> added this:
>
> else
>   $stderr.print "Unknown command: '#{command}'\n"
>
> just before the second-last line. Are you handling every incoming command
> as it expects?
>
> Incidentally, you could always turn those if statements into case/when,
> something like:
>
> case command
> when /^protover/
> ...
> when /^usermove/
> ...
> else
>   $stderr.print "Unknown command: '#{command}'\n"
> end
>
> This might make it easier if there are a lot of commands you need to
> respond to.
>
> Cheers,
> Garth
>
>