C言語からGaucheを使おう! (7) デバッグ用の道具を準備する

こんにちは、鈴木です。

 

「C言語からGaucheを使おう!」シリーズです。

前回の「C言語からGaucheを使おう! (6) Scm_Applyで手続きを呼び出す」で手続きを呼び出す方法を調べたので、今回はいよいよ Scheme プログラムを load する方法を調べよう!と思っていたのですが予定を変更します。

 

というのも、試行錯誤しながらなので、デバッグ用の道具(エラー表示やデバッグ出力など)を整理しておきたかったからです。

 

eval や load 時に発生したエラー内容を表示する

Scm_Eval/Scm_EvalCString を紹介した時に、以下のようなエラーハンドリングのコード(例外の内容を表示するコード)を記述しました。

この処理は何度か登場しているので、以下のようなマクロを定義しました。

関数ではなくマクロとしている理由は、ScmEvalPacket と ScmLoadPacket の両方を扱いたかったからです。

ScmLoadPacket は今後取り上げる予定の Scm_Load/Scm_LoadFromPort (load 相当の処理を行う関数)で使用する構造体です。

 

オブジェクトの内容を表示する

※コメントで教えて頂いた Scm_Printf() 関数を使用する方が簡単でしたので、「追記: Scm_Printf() で表示する」もご参照ください。

オブジェクトの内容を表示する方法は「C言語からGaucheを使おう! (2) 基本的な値の生成」でも登場しましたが、データ型に応じて SCM_INT_VALUE や SCM_BOOL_VALUE などを使い分けるのは面倒です。

そこで、Scheme における「(write object)」相当の処理を行う関数 print_object を作成しました。

 

追記: Scm_Printf() で表示する

コメントで shiro さんに教えて頂いた Scm_Printf() 関数を使用する方法です。(ありがとうございました)

手軽にオブジェクトの内容を表示したい場合は、この方法がお勧めです。

Scm_Printf() は以下のように、C言語の fprintf() のようなインタフェースで使用することができます。

関数の第一引数には ScmPort* を指定します。

標準出力を表す SCM_CUROUT, 標準エラー出力を表す SCM_CURERR マクロが定義されています。

write.c を確認すると、Scm_Sprintf() や Scm_Vsprintf() など、同じ系統の関数も定義されていましたので、用途に応じて使い分けると良さそうです。

 

まとめ

今回はデバッグ用の道具ということで、PRINT_EXCEPTION マクロと print_object 関数を作成しました。

次回は Scheme  プログラムを load する方法を調べたいと思います。

 

Comments are closed, but you can leave a trackback: Trackback URL.

Comments

  • shiro  On 2013年1月28日 at 12:18

    C言語からSchemeの値を表示するには、Scm_Printfも便利です。fprintfと似た感じで使えます。

    Scm_Printf(SCM_CUROUT, "The value is %S\n", obj);

    fprintfのFILE*に相当する第一引数にはScmPort*を渡します。現在の出力SCM_CUROUT, 現在のエラー出力SCM_CURERRというマクロが使えます。

    フォーマット指示文字列は%d, %l, %sなどがprintfと同様に使える他、%S, %AでScmObjが表示できます (%Sはwrite、%Aはdisplayによる表示)。また、%CでScmChar が表示できます。

    • 鈴木 圭  On 2013年1月28日 at 14:30

      shiro さん、コメントありがとうございます!

      Scm_Printf() という関数があったんですね。気付きませんでした(^^;
      エントリの内容にも追記させていただきました。