diff --git a/compiler/kernel-primitives.rkt b/compiler/kernel-primitives.rkt index e0108d9..c2d04a6 100644 --- a/compiler/kernel-primitives.rkt +++ b/compiler/kernel-primitives.rkt @@ -109,7 +109,8 @@ 'hash-remove! 'hash-remove 'equal-hash-code - + 'hash-count + 'string-copy )) (define-predicate KernelPrimitiveName? KernelPrimitiveName) diff --git a/js-assembler/runtime-src/baselib-hashes.js b/js-assembler/runtime-src/baselib-hashes.js index f27ed45..0e62b41 100644 --- a/js-assembler/runtime-src/baselib-hashes.js +++ b/js-assembler/runtime-src/baselib-hashes.js @@ -137,6 +137,10 @@ return new WhalesongHashtable(this.type, this.hash_function, this.equality_function, this.hash.clone()); }; + WhalesongHashtable.prototype.size = function() { + return this.hash.size(); + }; + WhalesongHashtable.prototype.toWrittenString = function (cache) { var keys = this.hash.keys(); var ret = [], i; @@ -251,6 +255,11 @@ this.map = map; }; + WhalesongImmutableHashtable.prototype.size = function() { + return this.map.items().length; + }; + + WhalesongImmutableHashtable.prototype.toWrittenString = function (cache) { var items = this.map.items(); var ret = [], i; diff --git a/js-assembler/runtime-src/baselib-primitives.js b/js-assembler/runtime-src/baselib-primitives.js index be66450..ae197e8 100644 --- a/js-assembler/runtime-src/baselib-primitives.js +++ b/js-assembler/runtime-src/baselib-primitives.js @@ -2578,6 +2578,13 @@ var hash = checkMutableHash(M, 'hash-copy', 0); return hash.clone(); }); + + installPrimitiveProcedure( + 'hash-count', + 1, + function(M) { + return checkHash(M, 'hash-count', 0).size(); + }); installPrimitiveProcedure( 'hash', diff --git a/lang/kernel.rkt b/lang/kernel.rkt index e77487d..12ea311 100644 --- a/lang/kernel.rkt +++ b/lang/kernel.rkt @@ -168,6 +168,7 @@ hash-remove! hash-remove equal-hash-code + hash-count diff --git a/tests/more-tests/hashes.expected b/tests/more-tests/hashes.expected index e785b29..2fd4962 100644 --- a/tests/more-tests/hashes.expected +++ b/tests/more-tests/hashes.expected @@ -55,3 +55,6 @@ true A alphabet + +1 +2 diff --git a/tests/more-tests/hashes.rkt b/tests/more-tests/hashes.rkt index b7ac7d8..cfca056 100644 --- a/tests/more-tests/hashes.rkt +++ b/tests/more-tests/hashes.rkt @@ -132,3 +132,9 @@ (hash-set! h2 'a "alphabet") (displayln (hash-ref h1 'a)) (displayln (hash-ref h2 'a))) + + +(newline) +(hash-count (make-hash '((a . a)))) +(hash-count (make-immutable-hash '((b . b) + (c . d)))) \ No newline at end of file