Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在scheme中访问多维哈希表中的键?_Scheme_Hashtable_Chicken Scheme - Fatal编程技术网

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

如何在scheme中访问多维哈希表中的键?,scheme,hashtable,chicken-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] ,例如。) 在读取字符串时,我需

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

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

a_string = the_hash[group_name][section_name][part_name]
,例如。)


在读取字符串时,我需要知道
组名称
节名称
,和
part\u name
是,我需要能够根据每个字符串的值以及每个
map
方案的
功能执行某些操作,因为在任何给定时刻,三个键/子键字符串中似乎只有一个可用。我不知道各自的字符串可能包含什么模式。网络搜索没有找到可行的解决方案。同时,我对这个计划还比较陌生,可能不像我应该熟悉的那样熟悉。有人能为我指出解决方案的方向吗?

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

虽然我很欣赏这个答案,但因为我事先不知道组名、节名和部分名的值,我不明白这如何帮助我在调用multi-hash-ref时知道它们的值。此外,我相信multi-hash-ref的lambda中的参数序列应该是(hk)而不是(kh),否?@xuinkrbin。这很有帮助,因为您只需将它们作为参数传递:
(多散列引用\u散列组\u名称部分\u名称)
。在我的Scheme解释器中,
foldl
中的
lambda
的参数是:
(当前元素,累积值)
,因此它对我有效。如果这不是鸡方案中的情况,请反转它们。好的,我想我可以在每组键上使用while循环来帮助填补任何空白。谢谢