From b380102564aad053f22586eb404e99c82635a3b0 Mon Sep 17 00:00:00 2001 From: Rob Browning Date: Sun, 16 Feb 2020 12:12:08 -0600 Subject: [PATCH 1/1] Implement hashing for keywords, i.e. (hash #:x ...) 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 | 3 +++ libguile/keywords.h | 2 ++ 2 files changed, 5 insertions(+) diff --git a/libguile/hash.c b/libguile/hash.c index d6e93dae0..c51a794c9 100644 --- a/libguile/hash.c +++ b/libguile/hash.c @@ -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: diff --git a/libguile/keywords.h b/libguile/keywords.h index c8f480869..cb8598d8b 100644 --- a/libguile/keywords.h +++ b/libguile/keywords.h @@ -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 */ -- 2.24.1