Gauche > Archives > 2010/08/16

2010/08/16 05:04:44 UTC(び)
#
(define log-string x->string)

(define-method log-string ((vals <sequence>))
  (string-join (map (cut uri-encode-string <> :encoding "utf-8") vals) ","))
#
みたいなことをすると、log-stringとx-stringの両方にメソッドが定義されちゃうのは、そういうものですか?
#
手抜き過ぎかな。
#
(define-method log-string (x) (x->string x))ってやれば何の問題もないのだけど。
2010/08/16 05:06:40 UTCshiro
#
そういうものです。log-stringと
#
x->stringが両方とも同一の#<generic>を指すわけですから。
2010/08/16 05:07:14 UTC(び)
#
了解です。
2010/08/16 05:07:57 UTCshiro
#
「log-stringとx->stringの両方にメソッドが定義される」んじゃなくて、「log-stringとx->stringの両方がさしている単一の#<generic>にメソッドが定義される」ってことですね。
2010/08/16 05:08:26 UTC(び)
#
はい
#
わかってるつもりでも、時々「あれ?」となる
2010/08/16 05:10:19 UTCshiro
#
まあ、define-methodが暗黙にdefine-genericを兼ねることがある、っていうのはあんまりSchemeっぽくないのは確か。
2010/08/16 05:23:51 UTC(び)
#
そうですね。普段はほぼ全くdefine-genericを使わないし、意識することもないのが、こういう時に陥穽になっているのかもしれないです。楽でいいんですけどね。CLの下地がないと、こういう時に「実体はgeneric function」という発想がぱっと出てこない。
2010/08/16 11:09:12 UTC(び)
#
そうか、define-methodには:key使えないんですね。
2010/08/16 11:11:28 UTCshiro
#
あーそれは改善したいと思ってるんですが、なんかnontrivialな変更が必要で保留にしてた気がする