*evalhook* とか applyhook とか

変数 *evalhook*

関数を突っ込んでおくと、なんらかの式を評価するときに実際に評価する代わりに *evalhook* に設定された関数が呼び出される。引数として以下の2つが与えられる。

  • 本来評価する式
  • environment object

変数 *applyhook*

関数を突っ込んでおくと、なんらかの関数が呼び出されるときに実際に関数を呼び出す代わりに *applyhook* に設定された関数が呼び出される。引数として以下の2つが与えられる。

  • 本来呼び出されるはずだった関数
  • 引数のリスト
(let ((*applyhook* #'apply-hook-fn))
  (some-fn (another-fn foo) bar baz))

という式だった場合、some-fn を呼び出すより先に引数を評価するので、先に another-fn の呼び出しで *applyhook* が実行される。

関数 evalhook: form evalhookfn applyhookfn &optional env

関数 applyhook: function args evalhookfn applyhookfn &optional env

説明されてもよくわかんないと思う(というか使ってみるまでわからなかった)のだが。
それぞれ evalhookfn や applyhookfn に与えられた関数を *evalhook* や *applyhook* として form を評価したり function に args を与えて呼び出したりする。ただし、その評価/呼び出し自体は *eval/apply-hook* の対象とはしない。

式を評価 と 関数呼び出し

普段全く意識しないけど、ちょっと違った。
式は `(関数 引数1 引数2)` みたいになってて、この式を評価するというのは

  1. 引数1 を評価
  2. 引数2 を評価
  3. 関数に result(1) と result(2) を与えて呼び出す

という手順になる。関数呼び出しは評価の一部でしかなかった。