Ryo Akagi
another_face_another_smile****@yahoo*****
2010年 12月 25日 (土) 18:47:21 JST
赤木といいます .stub のファイルの define-cclass で作ったクラスの getter/setter に cise のコード辺を入れても無視されてしまい、:type と slot名 から作ったも のが入ります。 具体的には、添付の hogelib.stub にありますが、要点だけ説明すると ------------------------------------------------------------------------------ "typedef struct ScmHoge_Rec { SCM_HEADER; int f; } ScmHoge;" (define-cclass <hoge> :private ScmHoge* "Scm_HogeClass" () ;cpl ([f :type <int> :getter (return (Scm_MakeInteger (+ 1000 (-> (SCM_HOGE OBJARG) f))))] )) ------------------------------------------------------------------------------ などと書くと、+1000 をしないC言語のgetterの関数が出来ます。 gauche.cgen.stub の Classとある部分のコメント(1240行あたり)の構文の定義 を見る限りだと slot の getter/setter は allocator,printer と同様に <proc-spec> なので、これも通るべきなのかと思いました。 でも、このコメントの塊の一番下では、<c-code> (c <c-name>) の書き方につ いて、allocator と printer にしか言及されていません。 また <proc-spec> := <c-code> | (c <c-name>) | #f | #t となっていますが allocator, printer に #t を入れると *** ERROR: Invalid CISE form: #t と出てしまいます。 これらを考えると、[allocator, printer] と slot は、別ものにするのか、同 じものにするのか、またどうしたいのか、どうあるべきかという事がよく分か らなくなってきました。 上の例で cise でも動く様にする様に自分でもやってみましたが(添付の stub.scm.diff)、なんとなく<cclass> の getter/setter の slot は、 emit-getter/setter 関数を実行する or しないという意味と、C言語の getter/setter 関数のソースとしての意味両方があって、ソースとしての意味 は slot名, :type, :c-spec, :c-name なども持っているので、複雑になってい るのかと思いました。 私が修正したものは、意図や、今後 :c-spec, :c-name の意味が広がったりす るのかなども分からないので、意味から考えたというよりも、その場の状況に 合わせただけなので、短かいですが分かりにくいと思います。 あともうひとつよく分からなかったのが、define-cclass で setter は #f に すると出なくなるのですが、getter は出ます。これはなぜでしょうか? 多分 emit-getter-n-setter の部分だと思うのですが。 添付ファイルの使い方の説明を書いておきます % gauche-package generate hoge hoge.scm hogelib.stub test.scm を添付のものと置き換える 後は、普通にやるなら autoconf; ./configure; make で特別な事はないと思い ます。 環境は以下です % gosh -V Gauche scheme shell, version 0.9.1 [utf-8,pthreads], i686-pc-linux-gnu また、私としては状況は分かって、ciseでなくてC言語で書けばいいだけなので 特に困っていません。 よろしくお願いします -------------- next part -------------- テキスト形式以外の添付ファイルを保管しました... ファイル名: stub.scm.diff 型: text/x-diff サイズ: 1017 バイト 説明: 無し Descargar -------------- next part -------------- ;;; ;;; hogelib.stub ;;; (declcode (.include <gauche/class.h> <gauche.h> "hoge.h") ) "static int g;" "typedef struct ScmHoge_Rec { SCM_HEADER; int a; int b; int c; int d; struct { int e; } st; int f; int h; int i; } ScmHoge;" "static ScmObj get_d(ScmObj o);" (define-cclass <hoge> :private ScmHoge* "Scm_HogeClass" () ;cpl ([a] [b :type <int>] [c :type <int> :getter "return Scm_MakeInteger(SCM_HOGE(OBJARG)->c + 10);"] [d :type <int> :getter (c get_d)] [e :type <int> :c-name "st.e"] [f :type <int> :getter (return (Scm_MakeInteger (+ 1000 (-> (SCM_HOGE OBJARG) f))))] [g :type <int> :c-spec "g"] [h :type <int> :getter #f] [i :type <int> :setter #f] ) [allocator (let* ((o :: ScmHoge* (SCM_ALLOCATE ScmHoge klass))) (SCM_SET_CLASS o klass) (return (SCM_OBJ o)))] ) (define-cfn get_d (o::ScmObj) ::ScmObj :static (return (Scm_MakeInteger (+ 100 (-> (SCM_HOGE o) d))))) ;; Local variables: ;; mode: scheme ;; end: -------------- next part -------------- ;;; ;;; hoge ;;; (define-module hoge (export <hoge> ) ) (select-module hoge) ;; Loads extension (dynamic-load "hoge") ;; ;; Put your Scheme definitions here ;; -------------- next part -------------- ;;; ;;; Test hoge ;;; (use gauche.test) (test-start "hoge") (use hoge) (test-module 'hoge) (let1 x (make <hoge>) (print x) (slot-set! x 'b 2) (print "b:" (slot-ref x 'b)) (slot-set! x 'c 2) (print "c:" (slot-ref x 'c)) (slot-set! x 'd 2) (print "d:" (slot-ref x 'd)) (slot-set! x 'e 2) (print "e:" (slot-ref x 'e)) (slot-set! x 'f 2) (print "f:" (slot-ref x 'f)) (slot-set! x 'g 3) (print "g:" (slot-ref x 'g)) ) ;; epilogue (test-end)