IR のダンプ(--dump-ir)
コンパイラが受け取るのは、書いたソースそのものではありません。バックエンドが動く時点で、
フロントエンドはトップレベルの(load "...")を織り込み、マクロを展開し、プログラムが参照する
ライブラリを接合し、Scheme のファイルをコアフォームへ下げています。--dump-irはその最終形——
IR をソース順に一行一フォームで——表示し、コンパイルも実行もせずに終了します。
$ cat greeting.lisp
(defmacro shout (s) `(concatenate 'string ,s "!"))
(print (shout "hello"))
$ rontolisp greeting.lisp --dump-ir
(PRINT (CONCATENATE (QUOTE STRING) "hello" "!"))
ダンプはそのまま Common Lisp として読めるので、rontolispに食わせれば同じプログラムと
して動きます。マクロ展開や Scheme の lowering が実際に何を生成したかは、diff 一つで確かめ
られるという意味で、このフラグはフロントエンドの調査用の差分取り向けです。
最後の展開はダンプの中で行われます。組み込みマクロの呼び出し(cond・setf・unless な
ど)は、その下にあるコアフォームへと下げられて出力されます。これはインタプリタが評価時に、
コンパイラがコード生成時に施すのと同じ展開です——つまり組み込みマクロが何をしたかも、diff
一つで確かめられます。ローカルのflet/macrolet/symbol-macroletが同名を覆っている呼
び出しと、下げ先がコンパイルパス固有のランタイム機械である呼び出し(条件設計子や定義フォー
ム)は、そのままの形で出て消費者に委ねられます。引用データには立ち入りません。下げられたダ
ンプも同じ出力に実行でき、その往復を CLI のテストが確かめています。
ダンプはどのバックエンドを選ぶかより前に行われるので、対象どおりに差はありません。-o は
コンパイルが何も書かないこのモードでは意味を持たないため、名指しで拒否されます。プログラムが
引き起こすライブラリの接合もダンプに現れるため、scheme や vec: を使うプログラムの
ダンプには、プログラム本体のフォームに先立ってそれらの定義が並びます。警告はコンパイル時と
同じ形式で標準エラー出力に出て、標準出力はダンプだけで占められます。