1. macroexpand hook
    1. 第一引数expansion function
    2. 第二引数マクロ全体
    3. 第三引数environment object
    4. expansion functionを呼ぶ
      1. 第一引数マクロ全体
      2. 第二引数environment object
    5. 結果のformが元々のformに置き換えられて再評価される
  2. Symbol
    1. symbol macro
      1. define-symbol-macroやsymbol-macletで定義される
      2. macroexpand hookによって評価される
    2. variable
      1. valueが返される
      2. lexical variables
        1. lexical scope経由でのみ参照可能
      3. dynamic variables
        1. ローカルで宣言
        2. specialでグローバルに宣言
        3. dynamic bindingで作成され、lexical bindingで隠れていない
      4. constant variables
        1. defconstantで定義
        2. 予約されたキーワード、シンボル
          1. nil
          2. ()
          3. '()
          4. 'nil
          5. false
          6. t, pi, array-total-size-limit, ...
  3. Cons
    1. carがsymbol
      1. special form
        1. carがspecial operator
        2. 処理フローなど特別な処理
        3. block, function, let, if, progn, quote, setq...
        4. special operatorによってどのように処理するか異なる
      2. macro form
        1. carがmacro operator
        2. macro operatorからexpansion functionを取得
        3. macroexpand hookによって評価される
        4. macro formを結果のformに置き換えて再度評価
      3. function form
        1. cdrを左から順番に評価
        2. 評価結果から引数を構築する
        3. 関数を呼び出す
        4. carが未定義のときはundefined-function
    2. carがnot symbol
      1. lambda form
        1. 関数名がlamda formであるfunction form
        2. funcallと同様に評価する
  4. Self-evaluating objects
    1. number
    2. path name
    3. array