From: David Thompson <dthompson2@worcester.edu>
To: "Ludovic Courtès" <ludo@gnu.org>
Cc: Mark H Weaver <mhw@netris.org>, guile-devel <guile-devel@gnu.org>
Subject: Re: [PATCH] Add procedures to convert alists into hash tables
Date: Sun, 17 Nov 2013 21:42:03 -0500 [thread overview]
Message-ID: <52897E7B.6000602@worcester.edu> (raw)
In-Reply-To: <5289726B.6030302@worcester.edu>
[-- Attachment #1: Type: text/plain, Size: 315 bytes --]
On 11/17/2013 08:50 PM, David Thompson wrote:
> Finally got around to updating this patch. I opted for adding a
> standalone module named (ice-9 hash-table) rather than including it from
> boot-9.
>
> How did I do?
>
> - Dave
>
Forgot to add the new module file to Makefile.am.
Updated patch attached.
- Dave
[-- Attachment #2: 0001-Add-procedures-to-convert-alists-into-hash-tables.patch --]
[-- Type: text/x-patch, Size: 5972 bytes --]
From 03f604cc3dfffb816cfe66a355e36ede337749f1 Mon Sep 17 00:00:00 2001
From: David Thompson <dthompson2@worcester.edu>
Date: Sat, 19 Oct 2013 22:43:37 -0400
Subject: [PATCH] Add procedures to convert alists into hash tables.
* module/ice-9/hash-table.scm: New module.
* test-suite/tests/hash.test ("alist conversion"): Add tests.
* doc/ref/api-compound.texi (Hash Table Reference): Add docs.
---
doc/ref/api-compound.texi | 21 +++++++++++++++++++++
module/Makefile.am | 1 +
module/ice-9/hash-table.scm | 45 +++++++++++++++++++++++++++++++++++++++++++++
test-suite/tests/hash.test | 38 +++++++++++++++++++++++++++++++++++++-
4 files changed, 104 insertions(+), 1 deletion(-)
create mode 100644 module/ice-9/hash-table.scm
diff --git a/doc/ref/api-compound.texi b/doc/ref/api-compound.texi
index 94e0145..9e5e649 100644
--- a/doc/ref/api-compound.texi
+++ b/doc/ref/api-compound.texi
@@ -3829,6 +3829,27 @@ then it can use @var{size} to avoid rehashing when initial entries are
added.
@end deffn
+@deffn {Scheme Procedure} alist->hash-table alist
+@deffnx {Scheme Procedure} alist->hashq-table alist
+@deffnx {Scheme Procedure} alist->hashv-table alist
+@deffnx {Scheme Procedure} alist->hashx-table hash assoc alist
+Convert @var{alist} into a hash table. When keys are repeated in
+@var{alist}, the leftmost association takes precedence.
+
+@example
+(use-modules (ice-9 hash-table))
+(alist->hash-table '((foo . 1) (bar . 2)))
+@end example
+
+When converting to an extended hash table, custom @var{hash} and
+@var{assoc} procedures must be provided.
+
+@example
+(alist->hash-table hash assoc '((foo . 1) (bar . 2)))
+@end example
+
+@end deffn
+
@deffn {Scheme Procedure} hash-table? obj
@deffnx {C Function} scm_hash_table_p (obj)
Return @code{#t} if @var{obj} is a abstract hash table object.
diff --git a/module/Makefile.am b/module/Makefile.am
index e8dcd4a..8a7befd 100644
--- a/module/Makefile.am
+++ b/module/Makefile.am
@@ -207,6 +207,7 @@ ICE_9_SOURCES = \
ice-9/format.scm \
ice-9/futures.scm \
ice-9/getopt-long.scm \
+ ice-9/hash-table.scm \
ice-9/hcons.scm \
ice-9/i18n.scm \
ice-9/iconv.scm \
diff --git a/module/ice-9/hash-table.scm b/module/ice-9/hash-table.scm
new file mode 100644
index 0000000..6b0fa04
--- /dev/null
+++ b/module/ice-9/hash-table.scm
@@ -0,0 +1,45 @@
+;;;; hash-table.scm --- Additional hash table procedures
+;;;; Copyright (C) 2013 Free Software Foundation, Inc.
+;;;;
+;;;; This library is free software; you can redistribute it and/or
+;;;; modify it under the terms of the GNU Lesser General Public
+;;;; License as published by the Free Software Foundation; either
+;;;; version 3 of the License, or (at your option) any later version.
+;;;;
+;;;; This library is distributed in the hope that it will be useful,
+;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;;; Lesser General Public License for more details.
+;;;;
+;;;; You should have received a copy of the GNU Lesser General Public
+;;;; License along with this library; if not, write to the Free Software
+;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;;;;
+
+(define-module (ice-9 hash-table)
+ #:export (alist->hash-table
+ alist->hashq-table
+ alist->hashv-table
+ alist->hashx-table))
+
+(define-syntax-rule (define-alist-converter name hash-set-proc)
+ (define (name alist)
+ "Convert @var{alist} into a hash table."
+ (let ((table (make-hash-table)))
+ (for-each (lambda (pair)
+ (hash-set-proc table (car pair) (cdr pair)))
+ (reverse alist))
+ table)))
+
+(define-alist-converter alist->hash-table hash-set!)
+(define-alist-converter alist->hashq-table hashq-set!)
+(define-alist-converter alist->hashv-table hashv-set!)
+
+(define (alist->hashx-table hash assoc alist)
+ "Convert @var{alist} into a hash table with custom @var{hash} and
+@var{assoc} procedures."
+ (let ((table (make-hash-table)))
+ (for-each (lambda (pair)
+ (hashx-set! hash assoc table (car pair) (cdr pair)))
+ (reverse alist))
+ table))
diff --git a/test-suite/tests/hash.test b/test-suite/tests/hash.test
index 3bd4004..ad247f5 100644
--- a/test-suite/tests/hash.test
+++ b/test-suite/tests/hash.test
@@ -18,7 +18,8 @@
(define-module (test-suite test-numbers)
#:use-module (test-suite lib)
- #:use-module (ice-9 documentation))
+ #:use-module (ice-9 documentation)
+ #:use-module (ice-9 hash-table))
;;;
;;; hash
@@ -81,6 +82,41 @@
(write (make-hash-table 100)))))))
;;;
+;;; alist->hash-table
+;;;
+
+(with-test-prefix
+ "alist conversion"
+
+ (pass-if "alist->hash-table"
+ (let ((table (alist->hash-table '(("foo" . 1)
+ ("bar" . 2)
+ ("foo" . 3)))))
+ (and (= (hash-ref table "foo") 1)
+ (= (hash-ref table "bar") 2))))
+
+ (pass-if "alist->hashq-table"
+ (let ((table (alist->hashq-table '((foo . 1)
+ (bar . 2)
+ (foo . 3)))))
+ (and (= (hashq-ref table 'foo) 1)
+ (= (hashq-ref table 'bar) 2))))
+
+ (pass-if "alist->hashv-table"
+ (let ((table (alist->hashv-table '((1 . 1)
+ (2 . 2)
+ (1 . 3)))))
+ (and (= (hashv-ref table 1) 1)
+ (= (hashv-ref table 2) 2))))
+
+ (pass-if "alist->hashx-table"
+ (let ((table (alist->hashx-table hash assoc '((foo . 1)
+ (bar . 2)
+ (foo . 3)))))
+ (and (= (hashx-ref hash assoc table 'foo) 1)
+ (= (hashx-ref hash assoc table 'bar) 2)))))
+
+;;;
;;; usual set and reference
;;;
--
1.8.4.2
next prev parent reply other threads:[~2013-11-18 2:42 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-20 14:14 [PATCH] Add procedures to convert alists into hash tables David Thompson
2013-10-20 14:28 ` David Thompson
2013-10-21 17:00 ` Mark H Weaver
2013-10-22 3:03 ` David Thompson
2013-10-28 12:17 ` Chris K. Jester-Young
2013-10-28 23:51 ` David Thompson
2013-10-26 11:41 ` David Thompson
2013-10-29 12:38 ` Ludovic Courtès
2013-10-30 20:19 ` Thompson, David
2013-11-03 12:43 ` Thien-Thi Nguyen
2013-11-05 19:57 ` Mark H Weaver
2013-11-06 12:54 ` Ludovic Courtès
2013-11-06 13:14 ` Thompson, David
2013-11-18 1:50 ` David Thompson
2013-11-18 2:42 ` David Thompson [this message]
2013-11-18 3:22 ` Mark H Weaver
2013-11-18 20:32 ` Ludovic Courtès
2013-11-19 2:00 ` David Thompson
2013-11-19 4:06 ` Mark H Weaver
2013-11-19 13:14 ` Thompson, David
2014-03-24 21:06 ` Andy Wingo
2014-03-24 22:15 ` Ludovic Courtès
2014-03-24 22:26 ` Andy Wingo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52897E7B.6000602@worcester.edu \
--to=dthompson2@worcester.edu \
--cc=guile-devel@gnu.org \
--cc=ludo@gnu.org \
--cc=mhw@netris.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).