[Gauche-devel-jp] <cclass> の setter/getter に cise は書けない?

Back to archive index

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)



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