TL;DR
テキストで書かれたソースコードを読み込み、コンパイラが解釈できるデータ構造に変換する、Clojure の仕組み。
なぜ必要か
Clojure のプログラムは、テキストの文法ではなく、データ構造の評価として定義される。一方で、ほとんどのプログラムはテキストファイルとして書かれる。このテキストを解析してデータ構造を作るのがリーダーの役割である。
仕組み
リーダーはストリームからフォームを読み込み、そのフォームが表すオブジェクトを返す。この処理は read 関数として公開されている。リーダーが読むのは、シンボル、リテラル、リスト、ベクター、マップ、セットなどである。リストは ()、ベクターは []、マップは {}、セットは #{} で書く。
クォート(')、コメント(;)、deref(@)、メタデータ(^)、ディスパッチ(#)、シンタックスクォート(`、~、~@)などは、リーダーマクロとして動く。
リーダーは edn のスーパーセットに対応している。edn に加えて、名前空間付きマップ、タグ付きリテラル、リーダーコンディショナルなどの拡張を持つ。