506 ：デフォルトの名無しさん ：2006/06/25(日) 12:09:47

OCamlに足りないものってなんだろうね。 509 ：デフォルトの名無しさん ：2006/06/25(日) 16:04:32

世話焼きの幼馴染

とりあえず型推論エラーだけ。

$ cat err.ml 1+true $ ./tuncamlc.rb err.ml File "foo.ml", line 1, characters 2-6: あんた bool と int を間違えてるでしょ。ほんとにバカねえ、バカバカ。 べ、別にあんたのことが気になるとかそういうんじゃないんだからね！ 早く直しなさいよ…



型名が長くて1行に収まらないと、パターンマッチに失敗して残念な結果になります。ごめんなさい。

#!/usr/bin/ruby -- def tundelize(a,b) <<MSG あんた #{a} と #{b} を間違えてるでしょ。ほんとにバカねえ、バカバカ。 べ、別にあんたのことが気になるとかそういうんじゃないんだからね！ 早く直しなさいよ… MSG end args = ARGV.join(" ") ocamlc = "ocamlc" #puts "#{ocamlc} #{args}" errr,errw = IO.pipe() pid = fork { STDERR.reopen(errw) exec "#{ocamlc} #{args}" } errors = [] t = Thread.start { epos = "" emsg = "" while l = errr.gets if l =~ /File \".*\", line \d+, characters \d+-\d+/ errors << [epos, emsg] epos = l else emsg += l end end errors << [epos,emsg] } st = Process.waitpid2(pid)[1] errw.close t.join errors.shift errors.each {|p,m| STDERR.puts p if m =~ /This expression has type (.+) but is here used with type (.+)/ STDERR.puts(tundelize($1,$2)) else STDERR.puts m end } exit st.exitstatus