d11*_*wtq 5 scheme dictionary guile
我正在玩诡计,试图熟悉纯函数式编程概念.在我可以用任何语言做任何有用的事情之前,我需要了解一些基本的数据结构以及如何有效地操作它们......特别是可枚举的数据结构.
我可以迭代这样的列表(我不确定我是否正确缩进):
(map (lambda (v)
(display (string-append v "\n"))
'(1 2 3))
=>
1
2
3
Run Code Online (Sandbox Code Playgroud)
散列表/哈希映射在scheme中是什么样的?是否有真正的数据结构来表示一个,或者它是否归结为列表列表?在这种情况下,如何将键和值作为单独的变量从内部列表中获取?
显然这是错误的,因为lambda期望一个值,而不是两个:
(map (lambda (key value)
(display (string-append key " => " value))
'('("one" 1) '("two" 2) '("three" 3)))
Run Code Online (Sandbox Code Playgroud)
我正在尝试做的Ruby相当于:
{ "one" => 1, "two" => 2, "three" => 3 }.map do |key, value|
puts "#{key} => #{value}"
end
Run Code Online (Sandbox Code Playgroud)
如果您使用R6RS 哈希表,则可以使用hashtable-keys和hashtable-entries函数。
如果您使用Guile 的本机哈希表,则可以使用hash-map->list、hash-for-each、hash-for-each-handle或hash-fold。
因此,对于您的示例,使用 Guile's 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)
Run Code Online (Sandbox Code Playgroud)