scheme - 如何在方案中访问多维哈希表中的键?

标签 scheme hashtable chicken-scheme

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

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

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

, 例如。)

在我读取字符串时,我需要知道 group_name 是什么, section_name , 和 part_name是,我需要能够根据每个字符串的值和 for-each 执行某些操作。和 map Scheme 的功能似乎还不够,因为在任何给定时刻似乎只有三个键/子键字符串之一可用。我不知道各个字符串可能包含哪些模式。网络搜索没有找到可行的解决方案。同时,我对 Scheme 比较陌生,可能不是我应该熟悉的。任何人都可以指出我的解决方案方向吗?

最佳答案

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 提供了很多 procedures对于处理“普通”哈希表,其中一些将很有用,因为此实现在后台使用普通哈希表。

关于scheme - 如何在方案中访问多维哈希表中的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14349926/

相关文章:

scheme - SICP 反流

lisp - 如何调用Racket中的其他程序?

scheme - `values` 在 Scheme 中是如何工作的?

c - 我该如何更改Graph结构(插入速度非常慢)?

arrays - 为什么哈希表在存储桶的数组上使用链表?

iphone - 将VNC Mac应用程序的Chicken移植到iPhone应用程序中的问题

scheme - 在Scheme : bad idea?中实现 "Pythonic"映射

c++ - Linux C++ 编译错误

asynchronous - Scheme中的CSP风格异步编程(CHICKEN)

lambda - 对Scheme中定义的参数: lambdas vs.的不同处理