この段階で,デバックシステムの行なうことは,ABCL/f プログラムの各実行時のポイントが変換後のC++プログラムの どの箇所に対応するかという情報が生成することである.
この際注意しなくてはいけない点は,ABCL/f の持つマクロ展開に対応した情報 を生成しなくてはいけないということである. ABCL/f はユーザ定義によるマクロ展開を許している. これによって,ユーザは複雑な構文を容易に定義,使用することができる. これらのマクロ文は多用され,ライブラリのように蓄積される傾向がある. このため,ユーザがマクロ展開以前のプログラム文面を通して プログラムのデバッグができることが必須である. 本実装では,コンパイラのフロントエンド部でおこなわれるマクロ展開の際, シンボル情報の対応もとられるようになっている.
現在,マクロ展開は lisp の macro expand と同じもので出来ている. シンボル情報の対応については,マクロ展開時の以下のような 指定によって行われている.
また,S式中のアトムに関しては,そのライン情報は保持されていないのは, アトムは式の実行単位にならないからである.
例えば,以下のようなdotimesをマクロ定義しようとするの場合を考える.
;dotimesの例 (dotimes (i n r) :reply-type (list fixnum) (push i r)))) ;マクロ定義 (def-fpp-macro dotimes dotimes-body (match `(dotimes ,@dotimes-body) (('dotimes iterater :reply-type type . body) (match iterater ((i limit ret) (let ((limit-var (gen-temporary 'dt))) `(let ((,limit-var ,limit)) (do ((,i 0 (+ ,i 1))) ((= ,i ,limit-var) :reply-type ,type ,ret) ,@body))))))))この場合,dotimesの中のiteraterに相当するのは(i n r)部であり, マクロ展開後のiteraterに相当するのは doのiterater つまり(+ i 1) である. つまり,iteraterどうしを対応させるためには, 展開後の(+ i 1)部に (i n r)の位置情報を与える必要がある. このため,iteraterの実行をライン情報として取り込み, 変換後の式に埋め込むこととする. 具体的には,以下のように変更することで, doのstep実行部として,そのiteraterのライン情報をとりこむことができる.
(def-fpp-macro dotimes dotimes-body (match `(dotimes ,@dotimes-body) (('dotimes iterater :reply-type type . body) (match iterater ((i limit ret) (let ((limit-var (gen-temporary 'dt))) `(let ((,limit-var ,limit)) (dbinfo :to (do ((,i 0 (dbinfo :of ,iterater :to (+ ,i 1)))) ((= ,i ,limit-var) :reply-type ,type ,ret) ,@body)))))))))