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

Back to archive index

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> 

大和




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