C言語からGaucheを使おう! (3) リスト操作

こんにちは、鈴木です。

 

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

C言語からGaucheを使おう! (2) 基本的な値の生成」に続けて、今回はリストを操作する方法を調べます。

 

Scm_Cons 関数

Scm_Cons 関数は cons セルを生成します。

このコードは、以下の Scheme コードと同じです。

以下のようにすると Scheme のコードと見た目が近くなります。

 

SCM_LISTn マクロ

要素数が 1 〜 5 のリストを手軽に作成するために、SCM_LIST1 〜 SCM_LIST5 というマクロも準備されています。

定義を見れば一目瞭然ですが、以下のように使用します。

構築するリストの要素数が固定である場合は、上記マクロを使用すると便利そうです。

 

Scm_List 関数

Scm_List 関数は、可変個の引数からリストを生成する関数です。

使い方は難しくありませんが、最後の引数として NULL を渡す必要があるので注意しましょう。

※補足ですが、C言語で可変個の引数を取る関数を作成する場合は、引数として「引数の数」を渡すか、最後の引数に NULL などの特定の値を渡すことが一般的です。Scm_List は後者の方法で、最後に NULL が渡される前提で実装されています。

 

リストの操作: Scm_Car, Scm_Cdr 関数

Scheme でリストを操作するときの基本は、car と cdr です。

Gauche では car と cdr に相当する Scm_Car と Scm_Cdr 関数が用意されています。

数値のみを含む単純なリストの値を表示する場合は、以下のようにループします。

for ループのところでは、list の先頭から Scm_Cdr で順番に辿っています。

ループの内側では、Scm_Car で要素を取り出し、それを表示しています。

実行すると以下の出力が得られます(※「C言語からGaucheを使おう! (1)」で作成した Makefile を使用しています)。

同様の処理を行う SCM_FOR_EACH というマクロもありますので、上記コードは以下のように書きなおすことができます。

 

その他のリスト操作

他にもリストを操作する多くの関数はが提供されています。

Scheme で定義されているリスト操作用の手続きに対応する C 言語関数が存在します。

いくつか試してみましょう。

 

まとめ

前回は値の生成、今回はリスト操作について調べました。

次回は文字列として用意した Scheme コードを eval する方法を調べようと思います。

 

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