如何在Scheme中访问多维哈希表中的键?

4

我在Chicken Scheme中有一个哈希表,哈希表的键对应的值是具有相应哈希值的哈希,而这些哈希又具有相应哈希值的值。 "内部哈希"的键具有相应的字符串值。(对于那些熟悉Ruby的人来说,设置哈希表的相关部分可能看起来像)

the_hash[group_name][section_name][part_name] = some_text

或者读取字符串:
a_string = the_hash[group_name][section_name][part_name]

当我读取字符串时,我需要知道group_namesection_namepart_name是什么,并且我需要能够根据每个字符串的值执行某些操作,而Scheme的for-eachmap特性似乎不足以实现这一点,因为在任何给定的时刻只有三个键/子键字符串中的一个似乎是可用的。我不知道各自的字符串可能具有什么模式。网络搜索没有找到可行的解决方案。同时,我对Scheme相对较新,可能不如应该熟悉。有人可以指引我解决方案的方向吗?

1个回答

2

Scheme没有内置支持多维哈希的功能,但是通过正确的抽象可以构建自己的实现:

; create a new multidimensional hash table
(define (make-multi-hash)
  (make-hash-table))

; set a value given a non-empty sequence of keys
(define (multi-hash-set! hash-table value . keys)
  (let loop ((hash hash-table)
             (keys keys))
    (cond ((null? (cdr keys))
           (hash-table-set! hash (car keys) value))
          (else
           (if (not (hash-table-exists? hash (car keys)))
             (hash-table-set! hash (car keys) (make-multi-hash)))
           (loop (hash-table-ref hash (car keys)) (cdr keys))))))

; retrieve a value given a non-empty sequence of keys
(define (multi-hash-ref hash-table . keys)
  (foldl (lambda (k h) (hash-table-ref h k))
         hash-table
         keys))

使用方法如下:

(define h (make-multi-hash))
(multi-hash-set! h 42 'a 'b 'c)
(multi-hash-ref h 'a 'b 'c)
=> 42

使用上述程序作为起点,您肯定可以实现所需的功能。此外,请注意,Chicken Scheme提供了许多用于处理“普通”哈希表的程序,其中一些将非常有用,因为此实现在幕后使用普通哈希表。


虽然我很感激这个答案,但由于我事先不知道group_name、section_name和part_name的值,所以我不知道如何在调用multi-hash-ref时知道它们的值。 - xuinkrbin.
1
另外,我认为 multi-hash-ref 中 lambda 的参数顺序应该是 (h k) 而不是 (k h),对吧? - xuinkrbin.
@xuinkrbin。它很有用,因为你可以将它们作为参数传递:(multi-hash-ref the_hash group_name section_name part_name)。在我的Scheme解释器中,foldllambda的参数是:(current-element, accumulated-value),所以这对我很有效。如果在Chicken Scheme中不是这种情况,请反转它们。 - Óscar López
好的,我想我可以使用while循环来遍历每组键,以帮助填补任何空缺。谢谢! - xuinkrbin.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接