C言語からGaucheを使おう! (2) 基本的な値の生成

こんにちは、鈴木です。

 

C言語からGaucheを使おう! (1)」の続編です。

前回は何もしないプログラムをコンパイル&実行するところまで行いました。

今回は、数値や文字列などの基本的な値の生成と、それを表示する方法を調べます。

 

数値型

gauche.h の中に、数値型の値を生成する SCM_MAKE_INT というマクロを見つけました。

これが足がかりになりそうです。

SCM_OBJ の定義は以下のようになっており、ScmObj にキャストされていました。

ScmObj が Gauche が扱う値を表す、ということでしょうか。

SCM_MAKE_INT の周辺を見ると、オブジェクトが数値型であるか判定する SCM_INTP や、数値オブジェクトから値を取り出す SCM_INT_VALUE も定義されていました。

サンプルコードを書いて動作を確認します。

コンパイル&実行します(※「C言語からGaucheを使おう! (1)」で準備した Makefile を使います)。

ここまでの内容で、

  • 数値オブジェクトを生成する方法(SCM_MAKE_INT)
  • 数値オブジェクトであるか判定する方法(SCM_INTP)
  • 数値オブジェクトから値を取り出す方法(SCM_INT_VALUE)

が分かりました。

 

その他のデータ型

gauche.h には数値以外のためのマクロも定義されていました。

BOOL、INT、CHAR、MAYBE がありました。MAYBE は基本的な値ではなさそうなので、今回は深入りしません。

 

BOOL型

BOOL型についても、サンプルコードで確認してみます。

実行すると、以下の出力が得られました。

BOOL型の値は定数 SCM_TRUE、SCM_FALSE も定義されていますので、次のように書くこともできます。

 

文字型

文字型は次のように扱います。

実行すると以下の出力が得られました。

 

文字列型

文字列型については gauche.h ではなく gauche/string.h に SCM_MAKE_STR がありました。

文字列は今まで見てきたデータ型と比べて複雑な構造をしているようで、SCM_STRING_COPYING や SCM_STRING_IMMUTABLE などのフラグを持つようです。

gauche/string.h 中のコメントから、変更可能(mutable)な Scheme 文字列をマルチスレッド環境で正しく動くようにするためにひと工夫していることが分かりました。

サンプルコードを書いて動作確認します。

文字列の生成には、SCM_MAKE_STR_IMMUTABLE を使用しました(引数にはリテラルの "Hello, Gauche" を与えており、C言語では文字列リテラルを変更することは NG のため)。

値の取得方法を調べていくと、いくつかの関数やマクロが定義されていました。

  • Scm_GetString 関数は変更可能な文字列を返す(内部的に文字列のコピーが発生する)
  • Scm_GetStringConst 関数は変更不可能な文字列を返す。
  • SCM_STRING_CONST_CSTRING は Scm_GetStringConst(SCM_STRING(obj)) に展開されるマクロ(ScmObj から ScmString へのキャストの手間を省略できる)。

ここでは読み取り専用で参照できれば十分のため、SCM_STRING_CONST_CSTRING で値を取得するようにしました。

実行すると、以下のようになります。

まとめ

今回調べてみてわかったことをまとめます。

  • 基本は ScmObj
  • SCM_MAKE_xxx から始まるマクロで基本的な値を生成する。(例:SCM_MAKE_INT)
  • SCM_xxx_VALUE で値を取得する。(例:SCM_INT_VALUE)
  • SCM_xxxP で方の判定を行う。(例:SCM_INTP で数値型であることを判定する)
  • まずは gauche.h を読む。
  • 文字列のように別のファイル(gauche/string.h)を読む必要もある。

少しずつ前進していますが、まだまだ分からないことがたくさんあります。

今後はリストを扱う方法や Schemeコードを評価する方法、Schemeコード内の手続きを呼び出す方法、C言語コードとSchemeコード間で値をやりとりする方法あたりから調べようと思います。

 

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