Нет недостатка в определении
(defun hash-keys (hash-table)
(loop for key being the hash-keys of hash-table collect key))
, потому что в Common Lisp функция компилируется.Если бы ваш поставщик предоставлял эту функцию, он бы делал то же самое и не был бы намного более эффективным, чем ваш. Если вообще вообще.
В интерпретируемых языках почти все, что вы пишете самостоятельно, имеет недостаток в производительности по сравнению с"внутренняя" рутина.
Извлечение содержимого хэша расточительно;Цикл позволяет вам обрабатывать хэш, не занимая память.Поэтому, возможно, вам нужен макрос вместо этого (некоторые Лиспы предоставляют dohash
или аналогичное расширение).
(defmacro do-hash ((key-var val-var hash-expr &optional result-form) &body body)
(let ((hash-var (gensym "HASH-")))
`(loop with ,hash-var = ,hash-expr
for ,key-var being the hash-keys of ,hash-var
for ,val-var being the hash-values of ,hash-var
do (progn ,@body)
finally (return ,result-form))))
Или функцию отображения хеша:
(defun mapc-hash (hash-table fun)
(loop for key being the hash-keys of hash-table
for value being the hash-values of hash-table
do (funcall fun key value)))
Если язык имееткаждый возможный гаджет, подобный этому, который каждый может написать за минуту?
В Common Lisp есть встроенные батареи, но это другие виды батарей: вещи, которые на самом деле сложно сделать.Например, функция compile
для динамической компиляции кода во время выполнения.Большинству пользователей было бы непросто разработать такую вещь с нуля по сравнению с извлечением ключей или значений из хеш-таблицы с полдюжины различными способами.