[Gauche-devel-jp] hash-tableに対するpush!

Back to archive index

Shiro Kawai shiro****@lava*****
2014年 6月 12日 (木) 04:20:12 JST


なるほど。

push!は定義からして、対象となる場所の初期値が()であることを前提にしてます。
なので「初期値を別に与えないとならない場所」に使うのはドメインエラーとも言えます。

ということは、push!を一般のハッシュテーブルに使うには、
「初期値が()であると設定できるようなハッシュテーブル」を作れるように
しとくのが正しいかな。

ハッシュテーブルでデフォルトの初期値を与えられるようにするって機能は
昔から考えてはいたんですが優先度が低くて手をつけていませんでした。
汎用コンテナとしてハッシュテーブルを渡す場合に初期値が設定できた方が
便利なことは他にもあるので、このさいつけてみようかな。
変更が大きくなるようなら0.9.4には間に合わないかもしれませんが。

--shiro


From: Masatake YAMATO <yamat****@redha*****>
Subject: [Gauche-devel-jp] hash-tableに対するpush!
Date: Wed, 11 Jun 2014 17:40:33 +0900 (JST)

> 新しいバージョンの話題が出たところで申し
> わけないのですが、前から気になっていたことについて意見(希望)
> させて下さい。
> 
> hash-tableに対してpush!がhash-table-push!とは同じように
> 動作しません。set!, ref, mapがhash-tableでも使える
> おかげで、infoを引く機会がだいぶ減って快調にコーディング
> できています。性能はともかくpush!でhash-table-push!の代用で
> きると気分が良いです。どうでしょうか?
> 
> (define-method |setter of ref| ((ht <hash-table>) key default value)
>   (hash-table-put! ht key value))
> 
> を定義すると
> 
>    (push! (ref ht1 'a (list)) 1)
> 
> とpush先の最初のリストを用意しておいてやれば、動くのですが、できればいつでも
> デフォルト値無しの
> 
>    (push! (ref ht1 'a) 1)
> 
> あるいは
> 
>    (push! (~ ht1 'a) 1)
> 
> と書きたいです。push!の定義は汎用的になっているので、<hash-table>用に
> 調整する必要があるのではないかと思ったのですが、せっかくの汎用的な定義が
> 台無しになるように見えました。
> 
>     $ gosh -V
>     gosh -V
>     Gauche scheme shell, version 0.9.3.3 [utf-8,pthreads], x86_64-redhat-linux-gnu
>     $ gosh
>     gosh
>     gosh> (define ht0 (make-hash-table))
>     (define ht0 (make-hash-table))
>     ht0
>     gosh> (hash-table-push! ht0 'a 1)
>     (hash-table-push! ht0 'a 1)
>     #<undef>
>     gosh> (ref ht0 'a)
>     (ref ht0 'a)
>     (1)
>     gosh> (define ht1 (make-hash-table))
>     (define ht1 (make-hash-table))
>     ht1
>     gosh> (push! (ref ht1 'a) 1)
>     (push! (ref ht1 'a) 1)
>     *** ERROR: #<hash-table eq? 0x23211e0> doesn't have an entry for key a
>     Stack Trace:
>     _______________________________________
>       0  getter
> 
>     gosh> (push! (ref ht1 'a (list)) 1)
>     (push! (ref ht1 'a (list)) 1)
>     *** ERROR: no applicable method for #<generic |setter of ref| (6)> with arguments (#<hash-table eq? 0x23211e0> a () (1))
>     Stack Trace:
>     _______________________________________
>     gosh> (define-method |setter of ref| ((ht <hash-table>) key default value)
>       (hash-table-put! ht key value))
>     (define-method |setter of ref| ((ht <hash-table>) key default value)
>       (hash-table-put! ht key value))
>     #<generic |setter of ref| (7)>
>     gosh> (push! (ref ht1 'a (list)) 1)
>     (push! (ref ht1 'a (list)) 1)
>     #<undef>
>     gosh> (ref ht1 'a)
>     (ref ht1 'a)
>     (1)
>     gosh> 
> 
> 大和
> 
> _______________________________________________
> Gauche-devel-jp mailing list
> Gauch****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/gauche-devel-jp




Gauche-devel-jp メーリングリストの案内
Back to archive index