(rontolisp) docs

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: を使うプログラムの ダンプには、プログラム本体のフォームに先立ってそれらの定義が並びます。警告はコンパイル時と 同じ形式で標準エラー出力に出て、標準出力はダンプだけで占められます。