Implement hashing for keywords, i.e. (hash #:x ...)
authorRob Browning <rlb@defaultvalue.org>
Sun, 16 Feb 2020 18:12:08 +0000 (12:12 -0600)
committerRob Browning <rlb@defaultvalue.org>
Fri, 21 Feb 2020 07:36:14 +0000 (01:36 -0600)
Add keyword handling to (hash ...).  Previously it would just return the
same value for all keywords.

* libguile/hash.c (scm_raw_ihash): Add scm_tc7_keyword case.

* libguile/keywords.h (SCM_I_KEYWORD_HASH): New macro.

libguile/hash.c
libguile/keywords.h

index d6e93dae02f0bf7cef2b9c38b599c70ec5246d06..c51a794c9638ccd65a92446f397bbc5bb79f080b 100644 (file)
@@ -35,6 +35,7 @@
 #include "chars.h"
 #include "foreign.h"
 #include "gsubr.h"
+#include "keywords.h"
 #include "numbers.h"
 #include "pairs.h"
 #include "ports.h"
@@ -307,6 +308,8 @@ scm_raw_ihash (SCM obj, size_t depth)
       return scm_i_string_hash (obj);
     case scm_tc7_symbol:
       return scm_i_symbol_hash (obj);
+    case scm_tc7_keyword:
+      return SCM_I_KEYWORD_HASH (obj);
     case scm_tc7_pointer:
       return scm_raw_ihashq ((uintptr_t) SCM_POINTER_VALUE (obj));
     case scm_tc7_wvect:
index c8f4808695ff56eb23b1f6a2fd9079e8c23e7139..cb8598d8b4558e2d4d61a96f174d8143742fc7f9 100644 (file)
@@ -60,6 +60,8 @@ SCM_API void
 scm_c_bind_keyword_arguments (const char *subr, SCM rest,
                               scm_t_keyword_arguments_flags flags, ...);
 
+#define SCM_I_KEYWORD_HASH(x) scm_i_symbol_hash (SCM_CELL_OBJECT_1 (x))
+
 SCM_INTERNAL void scm_init_keywords (void);
 
 #endif  /* SCM_KEYWORDS_H */