diff --git a/Goldfish.tmu b/Goldfish.tmu index fca4e53b9ec60ea0eafb124e65df810d7e1a24c9..a9d061a44d9d429c5d1bfef3a0fa7c49bb5fbc4b 100644 --- a/Goldfish.tmu +++ b/Goldfish.tmu @@ -10928,6 +10928,8 @@ \ \ hash-table-find hash-table-count + \ \ hash-table-for-each + \ \ hash-table-\alist ) @@ -10962,6 +10964,8 @@ \ \ hash-table-find hash-table-count + \ \ hash-table-for-each + \ \ hash-table-\alist ) @@ -11594,13 +11598,13 @@ <\scm-chunk|goldfish/srfi/srfi-125.scm|true|true> - (define (hash-table-count pred ht) + (define hash-table-count - \ \ (let ((l (map values ht)) + \ \ (typed-lambda ((pred? procedure?) (ht hash-table?)) - \ \ \ \ \ \ \ \ (pred-l (lambda (x) (pred (car x) (cdr x))))) + \ \ \ \ (count (lambda (x) (pred? (car x) (cdr x))) - \ \ \ \ (count pred-l l))) + \ \ \ \ \ \ \ \ \ \ \ (map values ht)))) \; @@ -11665,6 +11669,38 @@ \; + + + + + <\scm-chunk|goldfish/srfi/srfi-125.scm|true|true> + (define hash-table-for-each + + \ \ (typed-lambda ((proc procedure?) (ht hash-table?)) + + \ \ \ \ (for-each (lambda (x) (proc (car x) (cdr x))) + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ ht))) + + \; + + + <\scm-chunk|tests/goldfish/liii/hash-table-test.scm|true|true> + (let1 cnt 0 + + \ \ (hash-table-for-each + + \ \ \ \ (lambda (k v) + + \ \ \ \ \ \ (set! cnt (+ cnt v))) + + \ \ \ \ (hash-table 'a 1 'b 2 'c 3)) + + \ \ (check cnt =\ 6)) + + \; + + alist>alist> diff --git a/goldfish/liii/hash-table.scm b/goldfish/liii/hash-table.scm index 02fca48ca7a516f9922c43fc28f86cfcde84ba50..97e278069acf800182efdfb7c47010c1aaad8585 100644 --- a/goldfish/liii/hash-table.scm +++ b/goldfish/liii/hash-table.scm @@ -26,6 +26,7 @@ hash-table-update!/default hash-table-pop! hash-table-clear! hash-table-size hash-table-keys hash-table-values hash-table-entries hash-table-find hash-table-count + hash-table-for-each hash-table->alist ) (begin diff --git a/goldfish/srfi/srfi-125.scm b/goldfish/srfi/srfi-125.scm index 6c98fc7ff9f861a5290328bbce7df3259efbba0d..dea26a8872d5ff7d04c885fc2778eb9a11d07e2c 100644 --- a/goldfish/srfi/srfi-125.scm +++ b/goldfish/srfi/srfi-125.scm @@ -27,6 +27,7 @@ hash-table-update!/default hash-table-pop! hash-table-clear! hash-table-size hash-table-keys hash-table-values hash-table-entries hash-table-find hash-table-count + hash-table-for-each hash-table->alist ) (begin @@ -119,10 +120,15 @@ (values ks vs)))) -(define (hash-table-count pred ht) - (let ((l (map values ht)) - (pred-l (lambda (x) (pred (car x) (cdr x))))) - (count pred-l l))) +(define hash-table-count + (typed-lambda ((pred? procedure?) (ht hash-table?)) + (count (lambda (x) (pred? (car x) (cdr x))) + (map values ht)))) + +(define hash-table-for-each + (typed-lambda ((proc procedure?) (ht hash-table?)) + (for-each (lambda (x) (proc (car x) (cdr x))) + ht))) (define hash-table->alist (typed-lambda ((ht hash-table?)) diff --git a/tests/goldfish/liii/hash-table-test.scm b/tests/goldfish/liii/hash-table-test.scm index fd1dd0a80bc24dc9ac786abc7f9177cffc4f240d..3b4c82a07aa177c784e00bb6dd9104b03f92d108 100644 --- a/tests/goldfish/liii/hash-table-test.scm +++ b/tests/goldfish/liii/hash-table-test.scm @@ -176,6 +176,13 @@ (= (char->integer (string-ref (symbol->string k) 0)) v)) (hash-table 'a 97 'b 98 'c 99)) => 3) +(let1 cnt 0 + (hash-table-for-each + (lambda (k v) + (set! cnt (+ cnt v))) + (hash-table 'a 1 'b 2 'c 3)) + (check cnt => 6)) + (let1 ht (make-hash-table) (check (hash-table->alist ht) => (list)) (hash-table-set! ht 'k1 'v1)