В хитроумной схеме, как я могу перебрать список пар ключ-значение (например, хэш-карту)?

Я играю с хитростью, чтобы попытаться познакомиться с концепциями чистого функционального программирования. Прежде чем я смогу сделать что-то полезное с каким-либо языком, мне нужно понять некоторые основные структуры данных и научиться эффективно ими манипулировать... в частности, перечисляемые структуры данных.

Я могу перебрать такой список (я не уверен, правильно ли я делаю отступ или нет):

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

Как выглядит хеш-таблица/хеш-карта на схеме? Существует ли реальная структура данных для ее представления или все сводится к созданию списка списков? В таком случае, как получить ключ и значение как отдельные переменные из внутреннего списка?

Очевидно, это неправильно, так как лямбда ожидает одно значение, а не два:

(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

person d11wtq    schedule 15.11.2011    source источник
comment
P.S. Вы должны использовать for-each вместо map, когда возвращаемое значение функции не используется.   -  person Chris Jester-Young    schedule 15.11.2011
comment
Спасибо, я получил карту со страницы вики по зацикливанию и просто предположил, что она использовалась, так как возвращаемое значение можно игнорировать :) Полезно знать!   -  person d11wtq    schedule 15.11.2011


Ответы (1)


Если вы используете хеш-таблицы R6RS , вы можете использовать функции hashtable-keys и hashtable-entries.

Если вы используете родные хеш-таблицы Guile, вы можно использовать hash-map->list, hash-for-each, hash-for-each-handle или hash-fold.

Итак, для вашего примера, используя hash-for-each Guile, вы должны сделать:

(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)
person Chris Jester-Young    schedule 15.11.2011
comment
Отлично, спасибо, я думаю, что я буду продолжать выяснять, что доступно изначально, прежде чем искать библиотеки (по крайней мере, для основных структур данных). Я никогда раньше не видел встроенной поддержки хеш-таблиц :) - person d11wtq; 15.11.2011