Преобразовать набор результатов в список хеш-таблиц в Chicken Scheme

Какой самый простой способ преобразовать набор результатов в список хеш-таблиц? Я новичок в Схеме и предпочел бы использовать библиотечную функцию, а не свою собственную. Я использую Цыпленок Схема с яйцом postgres. Спасибо!

(use postgresql)

(define conn (connect '((dbname . "thedb") (user . "foo") (password . "secret") (host . "somehost"))))

(define rs (query conn "select id, name from users"))

(row-map print rs)

;(row-map ??? rs) ;what would take the place of the ??? here that would convert the row a hashtable so I end up with a list of hashtables?

1 ответ

Это не работает так. row-map вызывает процедуру с записью в качестве позиционных аргументов, поэтому вы можете получить их только позиционным способом. Конечно, если вы знаете позиции, вы можете сделать что-то вроде этого:

(row-map* (lambda (id name)
            (alist->hash-table `((id . ,id) (name . ,name))))
          (query conn "SELECT id, name FROM users"))

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

Но что-то еще: почему вы конвертируете в хеш-таблицу? Более эффективно один раз просмотреть цикл результатов и выполнить вычисления внутри этой лямбды. В противном случае вы преобразуете полный результирующий набор в список хеш-таблиц, а затем сборщик мусора соберет результирующий набор. Предположительно, вы собираетесь повторить этот список еще раз (зачем еще создавать список?). Поэтому вместо того, чтобы делать это, просто поместите ваш код обработки в лямбду, описанную выше, и сохраните дополнительный обход.

Другие вопросы по тегам