Masatake YAMATO
yamat****@redha*****
2014年 6月 11日 (水) 17:40:33 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> 大和