Gauche > Archives > 2010/12/14

2010/12/14 04:31:17 UTCka2u
#
質問です。gaucheでdefine-classで定義したclassを文字列からインスタンス生成したいのですがどうすればいいでしょうか。
2010/12/14 05:35:23 UTC齊藤
#
http://practical-scheme.net/gauche/man/?l=jp&p=make
2010/12/14 05:46:27 UTCka2u
#
ありがとうございます。
#
すいません。ただ、makeに文字列を渡しても、Error: no applicable method for #<generic make (1)> with arguments ("hoge")と言われてしまうんですが、なにか勘違いしていますかね。
2010/12/14 05:51:10 UTC齊藤
#
(make クラス :スロット 値) という要領で。
2010/12/14 05:55:45 UTC齊藤
#
http://practical-scheme.net/gauche/man/?l=jp&p=%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E5%AE%9A%E7%BE%A9%E4%BE%8B
2010/12/14 05:56:03 UTChigepon
#
http://www.google.com/codesearch/p?hl=ja#puFhHwMO-xw/x.scm&q=gosh%20define-class%20make&sa=N&cd=1&ct=rc
#
クラス名を " で囲まずに make に渡します。
2010/12/14 05:58:35 UTC齊藤
#
「文字列から」っていうのはクラス名を文字列で渡したいという話だったのか…。 質問を勘違いしてたかも。
2010/12/14 05:59:16 UTCka2u
#
ありがとうございます。すみません、そうです。説明が下手で申し訳ありません。
#
perlでいうところの require "$file.pm";
#
してから$class->newというような形なんですが。
2010/12/14 06:07:19 UTC齊藤
#
perl 知らないのでわかんないや… (´・ω・`)
2010/12/14 06:13:42 UTChigepon
#
https://gist.github.com/740064 こんな感じですか?
#
https://gist.github.com/740064
2010/12/14 06:15:54 UTC齊藤
#
ちょっと状況が理解できてないんですけど、 global-variable-ref 的な話かなぁ。
2010/12/14 06:16:34 UTCka2u
#
おお、higeponさんありがとうございます。これで出来そうです。
2010/12/14 06:16:45 UTChigepon
#
クラス名が文字列として変数に束縛されていて、その変数からインスタンスを作りたいみたいな感じかなと。
2010/12/14 06:17:42 UTCka2u
#
動的に外部から渡された文字列からインスタンスを生成するのはgaucheではどうすればいいのかなと思いまして。あまりこういったことはやらないのですかね。
2010/12/14 06:19:27 UTC齊藤
#
上の higepon さんのコードだと new に文字列をリテラルで渡さないと駄目だと思うので、変数に入っている文字列からなら string->symbol して global-variable-ref に渡してクラスオブジェクトを取り出す必要があります。
#
Gauche 的にはスジの悪い方法だと言えると思います。
2010/12/14 06:21:20 UTChigepon
#
あらら。
#
確かにそうだ。
2010/12/14 06:22:14 UTCka2u
#
なるほど。
2010/12/14 06:23:27 UTChigepon
#
Gauche に裏口ないかなあ。
2010/12/14 06:48:54 UTCka2u
#
とりあえず、別の方法を模索してみます。ありがとうございました。
2010/12/14 06:52:11 UTCleque
#
global-variable-ref だと自由度が高過ぎるので、define-class を一段 wrap して 名前→クラス の対応をハッシュテーブルに書き込んでおいて、あとから参照できるようにするとかですかねえ
#
(define classes (make-hash-table 'string=?))

(define (class-named name)
  (hash-table-get classes name #f))

(define-syntax define-class+
  (syntax-rules ()
    ((_ name . rest)
     (begin
       (define-class name . rest)
       (hash-table-put! classes (symbol->string 'name) name)))))

(define-class+ <foo> () ())

(make (class-named "<foo>"))
#
みたいな
2010/12/14 07:01:45 UTCka2u
#
ちょっとだけ似たようなことを考えていました。でもlequeさんのやつのほうがいいですね。参考にさせてもらいます。
2010/12/14 16:58:05 UTCshiro
#
あれれまたtwitter bridgeが止まってたみたい。
#
global-variable-refを使わざるを得ない場面もあるにはあると思います。(cf. lib/dbm.scmの dbm-type->class これは必要なモジュールのロードまでやってますが、ある程度命名規則に寄りかかってる感じ。)