プログラミング言語SML#解説 3.7.1版
7 MLプログラミング入門

7.17 let式

MLプログラミングの基本は,種々の式を定義しそれらに名前を付け組み 合わせていくことです. これまで見てきた例では,名前はすべてトップレベルに記録されていま した. しかし,大きなプログラムでは,一時的に使用する多数の名前が必要と なり,それら名前を管理する必要があります. 例えばfactは,トップレベルに定義されたloopを使って定 義されていますが,この名前はfactの定義のためだけに導入されたもので あり,他の関数ではべつなループ関数が必要です. そこで,これら特定の処理にのみ必要な名前のスコープ(有効範囲)を 制限できれば,より整理され構造化されたコードとなります. そのために,以下のlet構文が用意されています.

expr  ::=
 | let decl_list in expr end
decl  ::= val x = expr
 | fun f p1 xn = expr
 |

letinの間には,inendの式の中だけで有 効な宣言が書けます. 例えば,末尾再帰のfact関数は,通常以下のように定義します.

  fun factorial n =
    let
      fun loop (s, 0) = s
         | loop (s, i) = loop (s * i, i - 1)
    in
      loop (1, n)
    end