Shiro Kawai
shiro****@lava*****
2010年 12月 31日 (金) 19:39:29 JST
define-cclassは必要に迫られてアドホックに作ったものなんで、 まだ仕様をちゃんと考えてなかったですね。 頂いたパッチで当面は良さそうですが、何をどうするつもりだったのか 覚えてないので、思いだしがてら考えてみます。 --shiro From: Ryo Akagi <another_face_another_smile****@yahoo*****> Subject: [Gauche-devel-jp] <cclass> の setter/getter に cise は書けない? Date: Sat, 25 Dec 2010 18:47:21 +0900 > 赤木といいます > > .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言語で書けばいいだけなので > 特に困っていません。 > > よろしくお願いします