改造中

やっぱ ?$label はかっこ悪いので $label にした。副作用:

  • let f $(x:int) = ... とは書けない
  • $ を binary op として使いたい場合は x $ y のようにちゃんとスペースを入れなければならない

$ を lexer token にしないための苦肉の策だが、まーそれでえーやろ。問題ありゃ parsing なんて後で変えればいいし。

動いているみたい:

# let f $x = x + 1;;
val f : $x:int -> int = <fun>
# f $x:1;;
- : int = 2
# f ~x:1;;
Characters 5-6:
  f ~x:1;;
       ^
Error: Expecting function has type $x:int -> int
This argument cannot be applied with label ~x
# let f $:x = x + 1;;
val f : $:int -> int = <fun>
# f $:1;;
- : int = 2

lexer.mll, parser.mly, printtyp.ml をいじるぐらい。楽なもんだ。