[Gauche-devel-jp] Re: SCM_RETURN(SCM_UNDEFINED) ?

Back to archive index

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







Gauche-devel-jp メーリングリストの案内
Back to archive index