lambdaに型が無い

Rubylambdaメソッドの型は、すんごいナイーブには

lambda : ('a -> 'b) -> Proc<'a, 'b>

みたいな感じになると思っていた。Proc<'a, 'b>は、call : 'a -> 'bみたいなcallメソッドを持つようなProcオブジェクトだと思ってください。

しかし、id:sumii先生の記事を見てたら、こんなのが書けてしまうのだと知った。

def f(&b)
  lambda.call
end

f { puts "hoge }

これで、hogeと印字される。lambdaメソッドにブロックを与えないで呼び出した場合には、lambdaを呼び出したメソッドに与えられたブロックが与えられるんだとか。

困ったなぁ。

ここで嫌らしいのは、lambdaが構文ではなくメソッドであるというところで、メソッドである以上再定義される可能性があるからlambda式に専用の型付け規則を与えるわけにはいかない。

Rubyプログラムの意味(という言葉の意味は、カジュアルなに使う言葉としての意味じゃなくて、セマンティクスという意味の意味)は、さっぱり理解できない。

まじめにやろうとすると、ものすごい拡張が必要になりそうな気がするから、見なかったことにしよう。