【问题标题】:In guile scheme, how can I iterate a list of key-value pairs (i.e. a Hash map)?在 guile 方案中,如何迭代键值对列表(即哈希映射)?
【发布时间】:2011-12-29 03:42:52
【问题描述】:

我正在玩弄诡计来尝试熟悉纯函数式编程概念。在我可以使用任何语言做任何有用的事情之前,我需要了解一些基本的数据结构以及如何有效地操作它们……尤其是可枚举的数据结构。

我可以像这样迭代一个列表(我不确定我是否正确缩进):

(map (lambda (v)
       (display (string-append v "\n"))
     '(1 2 3))
=>
1
2
3

哈希表/哈希映射在方案中是什么样的?是否有一个真实的数据结构来表示一个,还是归结为制作一个列表?在这种情况下,如何从内部列表中获取作为单独变量的键和值?

显然这是错误的,因为 lambda 需要一个值,而不是两个:

(map (lambda (key value)
       (display (string-append key " => " value))
     '('("one" 1) '("two" 2) '("three" 3)))

我正在尝试做的 Ruby 等价物是:

{ "one" => 1, "two" => 2, "three" => 3 }.map do |key, value|
  puts "#{key} => #{value}"
end

【问题讨论】:

  • P.S.当不使用函数的返回值时,您应该使用for-each 而不是map
  • 谢谢,我从 wiki 的页面中获得了关于循环的地图,并假设它已被使用,因为可以忽略返回值 :) 很高兴知道!

标签: dictionary scheme guile


【解决方案1】:

如果您使用的是R6RS hashtables,则可以使用hashtable-keyshashtable-entries 函数。

如果您使用的是Guile's native hashtables,则可以使用hash-map->listhash-for-eachhash-for-each-handlehash-fold

因此,对于您的示例,使用 Guile 的 hash-for-each,您可以:

(use-modules (ice-9 hash-table))
(define my-hash (make-hash-table))
(hash-set! my-hash "one" 1)
(hash-set! my-hash "two" 2)
(hash-set! my-hash "three" 3)
(hash-for-each (lambda (key value)
                 (format #t "~a => ~a~%" key value))
               my-hash)

【讨论】:

  • 太好了,谢谢,我想我会坚持在查看库之前弄清楚本机可用的内容(至少仅针对基本数据结构)。我以前从未见过原生哈希表支持 :)
猜你喜欢
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 2011-09-29
  • 2020-12-13
  • 2023-04-04
相关资源
最近更新 更多