##レジスタで渡される分に関してはあまり心配しないことにします > x64 abi。さっきvarargでlong/int絡みのバグをひとつ潰しましたが、long使うべきところでintにしちゃってるのがまだありそう。
#trieが<dictionary>でないのは単なる歴史的経緯かなあ。<dictionary>がわりと新しい追加なんで漏れてただけって気がします。
##CLOSSのことはよくわかっていないので、自信がないです。(汗
#https://gist.github.com/yamasushi/5352548 <dictionary>をこんなふうにしてみました。<sparse-vector-base>に追加する方法はまだよくわかりません。 #dict-push! dict-pop! dict-update! dict->alist は<dictionary>のmethodとしてもいいような気がしました。(trieにはないので、追加しないといけないのですけれど。)
#<dictoinary>は<collection>のサブクラスなので多重継承にする必要はないです。dict-push! etcは<dictionary>にフォールバックメソッドを用意しといてもいいですね。整理してみます。
#gosh> (use util.sparse)
#<undef>
gosh> (use gauche.dictionary)
#<undef>
gosh> (define a (make-sparse-vector))
a
gosh> (dict-put! a 1 100)
*** ERROR: no applicable method for #<generic dict-put! (5)> with arguments (#<<sparse-vector> 0x881f090> 1 100)
Stack Trace:
_______________________________________
0 (eval expr env)
At line 173 of "/usr/local/share/gauche-0.9/0.9.4_pre3/lib/gauche/interactive.scm"
gosh>
#sparse-vectorがdict-put!できないのです。
#diff --git a/ext/sparse/sparse.scm b/ext/sparse/sparse.scm
index 0ea6ec0..55f0e99 100644
--- a/ext/sparse/sparse.scm
+++ b/ext/sparse/sparse.scm
@@ -290,3 +290,21 @@
(define-method dict-fold ((dict <sparse-table>) proc seed)
(sparse-table-fold dict proc seed))
+
+(define-method dict-get ((dict <sparse-vector-base>) key . maybe-default)
+ (if (null? maybe-default)
+ (sparse-vector-ref dict key)
+ (sparse-vector-ref dict key (car maybe-default))))
+
+(define-method dict-put! ((dict <sparse-vector-base>) key val)
+ (sparse-vector-set! dict key val))
+
+(define-method dict-delete! ((dict <sparse-vector-base>) key)
+ (sparse-vector-delete! dict key))
+
+(define-method dict-exists? ((dict <sparse-vector-base>) key)
+ (sparse-vector-exists? dict key))
+
+(define-method dict-fold ((dict <sparse-vector-base>) proc seed)
+ (sparse-vector-fold dict proc seed))
+
#こうしてみました。
##<sparse-vector-base>は既に<dictionary>を継承してましたね。これまでの変更をひとつのパッチにまとめていただければapplyします。
#