* Menu
page 0 - << : 0 : >>
* 2008-09-25 :
http://snmsts.dreamhosters.com/diary/index.cgi?routine=one&name=2008-09-25-0306
C++としては合法というのが個人的な見解。
まず、戻り値が void の関数の戻り値として別の戻り値が void の関数を置くことが合法。
# http://ja.wikipedia.org/wiki/Return%E6%96%87#C.2FC.2B.2B
つまり、以下の関数 f はOK。
もうひとつ、C++でキャストは変換演算子とみなすことが可能。
演算子ということは関数で、void へのキャストは戻り値が void の関数ということになる。
ということは上の状況と等しい、ということで合法。
Cとして合法かどうかはよく分からない。
void f(void){
return (void)1;
}
C++としては合法というのが個人的な見解。
まず、戻り値が void の関数の戻り値として別の戻り値が void の関数を置くことが合法。
# http://ja.wikipedia.org/wiki/Return%E6%96%87#C.2FC.2B.2B
つまり、以下の関数 f はOK。
void g() {} void f() { return g(); }
もうひとつ、C++でキャストは変換演算子とみなすことが可能。
演算子ということは関数で、void へのキャストは戻り値が void の関数ということになる。
ということは上の状況と等しい、ということで合法。
Cとして合法かどうかはよく分からない。
* memo : xyzzy lisp FFI
いつかちゃんとまとめたい。
- 基本
- データ型関連
- int -> c:int, double -> c:double, ...
- ポインタ型は「(c:char *)」というようなリストの形で表現
- C の構造体は c:define-c-struct で定義
- C の関数を呼ぶ関連
- c:define-dll-entry で C 関数のインターフェースを作る
- c:define-dll-entry RETURN-TYPE NAME (&rest ARGS) DLL-NAME &optional EXPORT-NAME
- RETURN-TYPE 関数の戻り値
- NAME 関数名
- ARGS 関数の引数
- DLL-NAME DLLのパス
- EXPORT-NAME Cの関数名 (DLLでexportされているもの)
- データのやり取りは chunk を介する
- C から呼べる関数(callback関数)を作る関連
- c:defun-c-callable で作る
- c:defun-c-callable RETURN-TYPE NAME (&rest ARGS) &body BODY
- RETURN-TYPE 関数の戻り値の型
- NAME 関数名
- ARGS 関数の引数
- BODY 関数の定義
- データのやり取りは chunk を介する、ということで同上
- 注意点
- 下手をすると簡単に xyzzy が落ちることを頭に入れておく
- gc に注意する
- gc で回収されないオブジェクトを作らない
- C の関数が動いているときに chunk が gc されないように気をつける
- ポインタ型は全部「void *」とみなしても問題ない
- 「void *」は「unsigned long (32bit unsigned integer)」と等価として扱うこともできる
- xyzzy の未実装やバグにも注意
- その他、外部とのやり取り
- dde
- ole
* xyzzy lisp : uchardet
- universalchardet の C ライブラリを xyzzy から利用できるようにするライブラリを作りました。
- http://raido.sakura.ne.jp/southly/xyzzy/site-lisp/uchardet-20080121.lzh
- C のライブラリはこちら→http://www.void.in/wiki/Universalchardet
- 自動判定が外れて困った覚えはあまりないんですが、困っている人が結構いるみたいなのでさらしておきます。
- と言いつつ DLL を配布しているところがないので、使える人は限られるだろうなぁ。
- 同梱しないといけないんだろうけど、トリプルライセンスのバイナリ配布の条件がよく分からず。
- ソースも丸ごと同梱すれば良さそうだけど、使わないファイルを渡すのもなぁ、ということで保留中。
page 0 - << : 0 : >>