この段階で,デバックシステムの行なうことは,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)))))))))