#むー、それは難しいですね。「なにかにapplicableである」ということがわかったとしても、それを使う際には結局具体的な引数にapplyするしかないわけですよね。事前にチェックしておきたいのかもしれませんが、Gaucheの場合実行時にobject-applyメソッドが追加され得るので… (極端な話、一度 (define-method object-apply ((x <top>) . args) #f) とかしちゃえばあらゆるオブジェクトがapplicableになります)
#それでもどうしても調べたいなら、procedure?が#tを返すか、そうでなければobject-applyのメソッドの中の第一引数にマッチするものがあるかどうか調べる、とかですかね。
#そういえば,<char-set>にobject-applyが定義されていないのが初め意外だったんですが私だけでしょうか.char-set-contains?を期待しました.
#gosh> ($ delete-duplicates $ map ($ car $ (cut ~ <> 'specializers ) $) $ ~ object-apply 'methods )
(#<class <parameter>> #<class <hook>> #<class <condition-meta>> #<class <regmatch>> #<class <regexp>>)
#こんな感じで、第一引数をとってきて、チェックする・・・感じですか?
#<dictionary>もdict-getでobject-applyできてもいいような気もしますが、影響が大きいでしょうか・・・・
#refだと、symbolのdictionariのときにslotと区別がつかなくなる・・
#(define (gauche-applicables)
`( ,<procedure>
,@($ delete-duplicates $ map ($ car $ (cut ~ <> 'specializers ) $) $ ~ object-apply 'methods ) ) )
(define-method applicable? ((obj <top>))
(any (cut subtype? (class-of obj) <> ) (gauche-applicables) ) )
#こんな感じにしてみました。
#<dictionary> には ref がないんですね.でも <ordered-dictionary> は <sequence> を継承していて <sequence> には ref があるので…と思ったら referencer メソッドが無いと言われてしまった.
#<dictionary> は ref で dict-get できればいいような気がします.<hash-table> や <tree-map> でも ref 定義してありますし.
#あ、そうか。わたし万能アクセサばかり使っていたのもので、なにか勘違いしてました。slot-refを使えばいいわけですね。
#ああ、<char-set>もapplicableでいいなって思ったのは覚えてるんだけどつけるのを忘れてました。<dictionary>にrefがまだ無いのは、ordered-dictionaryでsequenceのrefと意味がかぶるからどうしようかなと思って保留にしてた気がします。