Erlangと外部Rubyプログラムの連携

『プログラムErlang』12章、Cの代わりにRubyで書いてみた。極力ベタな移植を心がけたが、随所にRubyらしさを漂わせたつもり。

example1_driver.rb

require './example1'
require './example1_comm'
 
def main()
  begin
    loop do
      fun, *args = read_cmd()
 
      result = case fun
               when 1
                 twice(args[0])
               when 2
                 sum(args[0], args[1])
               end
 
      write_cmd([result]) if result
    end
  rescue
    STDERR.puts("finishied")
    exit
  end
end
 
main()

example1_comm.rb

def read_cmd()
  len = read_exact(2).unpack('n').first
  read_exact(len).unpack('C*')
end
 
def write_cmd(cmds)
  bin = ([cmds.size] + cmds).pack('nC*')
  write_exact(bin, bin.size)
end
 
def read_exact(len)
  str = ""
  str += STDIN.sysread(len) while str.size < len
  str
end
 
def write_exact(bin, len)
  wrote = 0
  wrote += STDOUT.syswrite(bin[wrote...len]) while wrote < len
  wrote
end

example1.rbはそのまんまなので省略。

Leave a Reply