letrecはものすごく役立つ概念なんですが、書き方で悩みます。
letrecという名前の構成素を持つプログラミング言語というとLisp系、なかでもSchemeが挙げられるでしょう。Schemeには(たぶん他のLispでも)let, let*, letrec, letrec* とlet系の構文が4つもあります(例えば、higeponさんの記事)。書いた順番に依存する let*, letrec* なんてものは要らないので、letとletrecが僕が欲しいものです。
毎度思うのですが、letとletrecって区別する必要があるんでしょうか? 要するに、いくつかの変数を同時に(順番に依存せずに)束縛することです。束縛に再帰があるときはletrecになります。しかし、再帰がない状況でletrecを使っても何も悪いことは起きません。だったら、letrecだけあればいいのじゃないかと。いっそのこと、letにletrecの機能を含めてしまえば、3文字短いキーワード"let"だけで済みます。
というわけで、「letrec機能を持ったlet」だけがいいな、と。
賛同してくれる人がいるかどうかわかりませんが。
再帰を許すletの意味論は不動点になります。このことから、fixpointなんて露骨なキーワードを使う例もありますがどうなんでしょう? 分かりにくいと思いますね。不動点演算子はギリシャ文字μが使われるのでmuは? もっと分かりにくい!
「let 束縛 in 式」の順番を変えた書き方に「式 where 束縛」があります。どっちも同じ意味で書き方の違いだけです。それじゃwhereなんて要らないのか、というと、letよりwhereが便利な状況もあります。で、僕はよく知らないのですが(誰か教えてぇ)、whererec ってないのでしょうか? letとletrecがあるなら、whereとwhererecがありそうですが、whererecって見たことない。
それと、なんか気になってしょうがないのは、whereが後置されるスタイルだと“心の準備”ができない気がするんですよ。「この式に関する説明は後(where以降)にあります」という目印を先に出して欲しいわけです。で、先頭に来るキーワードをいくつか考えてみました。
- in 式 where 束縛 (let in の in)
- given 式 where 束縛 (You are given)
- gotten 式 where 束縛 (You have gotten)
- pose 式 where 束縛 (とりあえず提示、詳細後述)
- its 式 where 束縛 (it's)
どれもイマイチ感が…
結論になってませんが:
- 再帰を許すletがあればそれでよい。
- 束縛を後に書くwhere構文もあったほうが便利。
- whereが後置されることを示す目印が先頭に欲しい。