読者です 読者をやめる 読者になる 読者になる

OCamlに足りないもの

OCaml

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