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

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

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

(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)))

Рубиновый эквивалент того, что я пытаюсь сделать, будет:

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

1 Ответ

4 голосов
/ 15 ноября 2011

Если вы используете хеш-таблицы 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)
...