如何在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_namepart_name是什么,我需要能够根据每个字符串的值执行某些操作,Scheme的for-eachmap特征似乎不够,因为在任何给定时刻,三个键/子键字符串中似乎只有一个可用。我不知道各自的字符串可能包含什么模式。网上搜索没有找到可行的解决方案。同时,我对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提供了许多处理"普通"哈希表的过程,其中一些将是有用的,因为该实现在底层使用普通哈希表。

相关内容

  • 没有找到相关文章

最新更新