From c02c40f93e027c63b9ba97756247b58c8e3e5a46 Mon Sep 17 00:00:00 2001 From: Danny Yoo Date: Mon, 7 Nov 2011 19:02:07 -0500 Subject: [PATCH] hash-copy --- compiler/kernel-primitives.rkt | 1 + js-assembler/runtime-src/baselib-hashes.js | 4 ++++ js-assembler/runtime-src/baselib-primitives.js | 7 +++++++ lang/kernel.rkt | 1 + tests/more-tests/hashes.expected | 3 +++ tests/more-tests/hashes.rkt | 7 +++++++ 6 files changed, 23 insertions(+) diff --git a/compiler/kernel-primitives.rkt b/compiler/kernel-primitives.rkt index ecd1216..e0108d9 100644 --- a/compiler/kernel-primitives.rkt +++ b/compiler/kernel-primitives.rkt @@ -101,6 +101,7 @@ 'make-immutable-hash 'make-immutable-hasheqv 'make-immutable-hasheq + 'hash-copy 'hash-ref 'hash-has-key? 'hash-set! diff --git a/js-assembler/runtime-src/baselib-hashes.js b/js-assembler/runtime-src/baselib-hashes.js index 19e9371..f27ed45 100644 --- a/js-assembler/runtime-src/baselib-hashes.js +++ b/js-assembler/runtime-src/baselib-hashes.js @@ -133,6 +133,10 @@ this.hash = hash; }; + WhalesongHashtable.prototype.clone = function() { + return new WhalesongHashtable(this.type, this.hash_function, this.equality_function, this.hash.clone()); + }; + WhalesongHashtable.prototype.toWrittenString = function (cache) { var keys = this.hash.keys(); var ret = [], i; diff --git a/js-assembler/runtime-src/baselib-primitives.js b/js-assembler/runtime-src/baselib-primitives.js index 4c51476..be66450 100644 --- a/js-assembler/runtime-src/baselib-primitives.js +++ b/js-assembler/runtime-src/baselib-primitives.js @@ -2571,6 +2571,13 @@ return initializeHash(lst, plt.baselib.hashes.makeEqualHashtable()); }); + installPrimitiveProcedure( + 'hash-copy', + 1, + function(M) { + var hash = checkMutableHash(M, 'hash-copy', 0); + return hash.clone(); + }); installPrimitiveProcedure( 'hash', diff --git a/lang/kernel.rkt b/lang/kernel.rkt index 334ecff..e77487d 100644 --- a/lang/kernel.rkt +++ b/lang/kernel.rkt @@ -161,6 +161,7 @@ make-immutable-hash make-immutable-hasheqv make-immutable-hasheq + hash-copy hash-ref hash-set! hash-set diff --git a/tests/more-tests/hashes.expected b/tests/more-tests/hashes.expected index 98e9c68..e785b29 100644 --- a/tests/more-tests/hashes.expected +++ b/tests/more-tests/hashes.expected @@ -52,3 +52,6 @@ true #hash((1 . one) (2 . two)) #hasheqv((1 . one) (2 . two)) #hasheq((1 . one) (2 . two)) + +A +alphabet diff --git a/tests/more-tests/hashes.rkt b/tests/more-tests/hashes.rkt index 2ca21e5..b7ac7d8 100644 --- a/tests/more-tests/hashes.rkt +++ b/tests/more-tests/hashes.rkt @@ -125,3 +125,10 @@ (hasheqv 1 'one 2 'two) (hasheq 1 'one 2 'two) + +(newline) +(let* ([h1 (make-hash '((a . "A")))] + [h2 (hash-copy h1)]) + (hash-set! h2 'a "alphabet") + (displayln (hash-ref h1 'a)) + (displayln (hash-ref h2 'a)))