この初版はLua 5.0用に書かれました。依然として後続のバージョンで関連性が高いものの、一部違いがあります。
第4版はLua 5.3を対象とし、Amazonなどの書店から入手可能です。
本の購入により、Luaプロジェクトの支援にもつながります。


23.2 - フック

デバッグライブラリのフックメカニズムでは特定のイベントで呼び出される関数を登録して、プログラムの実行時に呼び出すことができます。フックのトリガーとなるイベントは4種類あります。call イベントは、Luaが関数を呼び出すたびに発生します。return イベントは、関数が返るたびに発生します。line イベントは、Luaが新しい行の実行を開始したときに発生します。count イベントは、指定された数の命令後に発生します。Luaは、コールを生成したイベントを示す文字列(「call」、「return」、「line」、または「count」)を単一引数としてフックを呼び出します。さらに、行イベントでは、2番目の引数として新しい行番号も渡されます。フック内では、いつでもdebug.getinfoを使用して詳細情報を取得できます。

フックを登録するには、debug.sethookを2つまたは3つの引数で呼び出します。最初の引数はフック関数です。2番目の引数は、監視するイベントを示す文字列です。オプションの3番目の引数は、countイベントを取得する頻度を示す数値です。call、return、lineイベントを監視するには、マスク文字列に最初の文字(`c´、`r´、または`l´)を追加します。countイベントを監視するには、単に3番目の引数としてカウンタを渡します。フックを無効にするには、引数なしでsethookを呼び出します。

簡単な例として、次のコードは基本的なトレーサをインストールします。このトレーサは、インタプリタが実行する各新しい行の数を出力します

    debug.sethook(print, "l")
printをフック関数としてインストールし、行イベントでのみ呼び出すようLuaに指示するだけです。さらに高度なトレーサは、getinfoを使用して、現在のファイル名をトレースに追加できます。
    function trace (event, line)
      local s = debug.getinfo(2).short_src
      print(s .. ":" .. line)
    end
    
    debug.sethook(trace, "l")