R、関数呼び出し、substituteの挙動

Rについては大変面白い言語なので(言語仕様的に)いずれ紹介エントリでも書こうかと思っている。
まあそれはともかく。

> x<-100
> substitute(x)
x # まあそうですね

> (function (x) substitute(x))(hoge)
hoge #substituteの引数が評価されてる……?

> p <- function(f,x) f(x)
> pp <- function(f,x) p(f,x)

> p(substitute,hoge)
hoge # 同じく

> pp(substitute,hoge)
x # ...?

この挙動は、おそらく引数が遅延評価されていることに由来する。
また、渡された引数を丸投げするだけの関数 function(x) f(x) もf呼び出し時に新たなPromiseを生成することを示唆している。
……と思うが、納得のいく説明がまだ思いつかない。
たとえばSchemeスペシャルフォームのように、substituteだけ呼び出し時に特別扱いされているとは考えたくないが……*1

*1:ださいので