Shiro Kawai
shiro****@lava*****
2005年 4月 18日 (月) 10:05:09 JST
From: Makoto Satoh <makot****@yahoo*****> Subject: [Gauche-devel-jp] SCM_RETURN(SCM_UNDEFINED) ? Date: Mon, 18 Apr 2005 09:53:09 +0900 (JST) > Cライブラリで関数がvoidを返すようになっている場合は、 > SCM_UNDEFINEDを返すのが筋でしょうか? そうですね。意味のある戻り値が無いわけですから。 例外として、Cライブラリ関数が複数の値をポインタ渡しした 領域に格納するような関数の場合は、Cのプロトタイプの戻り値がvoid であっても意味的には値を返していると考えられるので、Schemeでは 多値を返すようにする場合があります。例えばGdkのgdk_drawable_get_sizeは drawableを受け取って、そのwidthとheightを引数で渡されたポインタの 指す先に格納します: void gdk_drawable_get_size (GdkDrawable *drawable, gint *width, gint *height); このAPIはCの言語の制限でこうなっているわけで、意味的にはwidthとheightの ふたつの値を返すと考えるほうが自然です。Schemeバージョンではこうしています。 (define-cproc gdk-drawable-get-size (drawable::<gdk-drawable>) "gint w, h; gdk_drawable_get_size(drawable, &w, &h); SCM_RETURN2(SCM_MAKE_INT(w), SCM_MAKE_INT(h));") > その場合、gauche.testでは値が#<undef>かどうかを > 比較する術はないですよね? #<undef>かどうかを調べるundocumentedな述語はあるんですが、 そもそも#<undef>は戻り値に意味が無いから使ってるので、 テストで戻り値をチェックする必要も無いんじゃないでしょうか。 副作用を起こす関数のテストは、その副作用が本当に起きたかどうかを 調べるのが良いでしょう。 なお、全ての引数がgenstub組み込みの型変換を使える場合、例えば次のような C関数fooがある場合: void foo(int x, int y) define-cprocで引数型に<void>を指定すればUNDEFINEDを返すコードが 生成されます: (define-cproc foo (x::<int> y::<int>) (return <void> "foo")) --shiro