Gauche > Archives > 2013/04/10

2013/04/10 00:28:30 UTCyamasushi
#
http://practical-scheme.net/wiliki/wiliki.cgi?dictionary%E3%82%92%E4%BD%BF%E3%81%86 にdict-*系の操作をtrieで実装してみました。
2013/04/10 01:42:17 UTCshiro
#
レジスタで渡される分に関してはあまり心配しないことにします > x64 abi。さっきvarargでlong/int絡みのバグをひとつ潰しましたが、long使うべきところでintにしちゃってるのがまだありそう。
#
trieが<dictionary>でないのは単なる歴史的経緯かなあ。<dictionary>がわりと新しい追加なんで漏れてただけって気がします。
2013/04/10 05:07:46 UTCyamasushi
#
https://gist.github.com/yamasushi/5351959 こんなかんじにしてみました。
#
CLOSSのことはよくわかっていないので、自信がないです。(汗
2013/04/10 07:32:06 UTCyamasushi
#
https://gist.github.com/yamasushi/5352548 <dictionary>をこんなふうにしてみました。<sparse-vector-base>に追加する方法はまだよくわかりません。
#
dict-push! dict-pop! dict-update! dict->alist は<dictionary>のmethodとしてもいいような気がしました。(trieにはないので、追加しないといけないのですけれど。)
2013/04/10 07:41:22 UTCshiro
#
<dictoinary>は<collection>のサブクラスなので多重継承にする必要はないです。dict-push! etcは<dictionary>にフォールバックメソッドを用意しといてもいいですね。整理してみます。
2013/04/10 08:08:44 UTCyamasushi
#
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!できないのです。
2013/04/10 08:17:48 UTCyamasushi
#
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))
+
#
こうしてみました。
2013/04/10 08:33:30 UTCyamasushi
#
https://gist.github.com/yamasushi/5352858 push! pop!などもつけてみました。
2013/04/10 08:38:07 UTCshiro
#
<sparse-vector-base>は既に<dictionary>を継承してましたね。これまでの変更をひとつのパッチにまとめていただければapplyします。
2013/04/10 09:22:24 UTCyamasushi
#
https://gist.github.com/yamasushi/5353139 いまのgit diff -bです