旧gaaamiiのブログ

間違ったことを書いている時があります。コメントやTwitter、ブコメなどでご指摘ください

「レキシカルな束縛を作り出すためのフォーム」ってなんだ

孔雀の本を読んでいます。

第2章がClojure一巡りということで、言語の基本的な文法について説明されている。といってもそのほとんどが自分には何がなんだかわからず、以下の様な説明に頭を抱えました。

let 特殊形式はまさにレキシカルな束縛を作り出すためのフォームだ。

let が何だかはわからないけど、JSのvarのような何か、変数を宣言するための何かだろうと思っていた。けれども、レキシカル・束縛・フォーム、すべて意味を知らなかったので説明を読んで苦しくなった。

ドキュメントにはこう書かれている。

clojure.core/let
([bindings & body])
  binding => binding-form init-expr

  Evaluates the exprs in a lexical context in which the symbols in
  the binding-forms are bound to their respective init-exprs or parts
  therein.

なるほど。とはならなかった。

レキシカル( lexical )

どうやら「その関数内でのみ有効な」というような意味合いらしい。スコープの文脈で使われる言葉で、対になるのがdynamicという言葉っぽい。static とか local に近い感じがする。

束縛( binding )

これまた馴染みのない表現だけど、宣言のようなものらしい。ただ、他の言語と考え方が違う。

a = 10

普通の手続き型的なプログラミング言語で、aという変数に10という値を設定する、というようなことをするけどClojureではそうではなく、

(let [a 10])

10にaというシンボルを束縛するという考え方らしい。

使い方

普通にローカル変数の感覚で使って良さそうです。

(defn real-price [price]
  (let [tax 0.08]
    (+ price (* tax price))))

(real-price 19800)
21384.0

感想

たったこれだけのことだけど、REPLで試しながらあーとかうーとか言いながら試せるようになりました。何か作るにはまだ遠いけど、頭の中でプログラムを動かすことができない頭の悪い自分にとって、書いたコードをそのまま評価するREPLは相当有難い機能なんじゃないかと思います。

あと、ドキュメントをすらすら読んで理解できない場合にあたる情報としてClojureDocsというのが使い勝手が良いというのをこの前のClojure座談会で教わったので、それを当たりながらチュートリアルやら何やらを楽しみたいです。