From 5fc2c8ee2ffd53aec8c93ff42f42e6433dbdbd67 Mon Sep 17 00:00:00 2001 From: soukev Date: Mon, 15 Jun 2026 18:20:37 +0200 Subject: Base hash-table convenience functionality --- src/hash-table.lisp | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/hash-table.lisp (limited to 'src/hash-table.lisp') diff --git a/src/hash-table.lisp b/src/hash-table.lisp new file mode 100644 index 0000000..a53eb72 --- /dev/null +++ b/src/hash-table.lisp @@ -0,0 +1,37 @@ +(in-package #:substrate/hash-table) + +(defmacro hash (&rest pairs) + "Convenience macro for hash-table creation. +Combines `make-hash-table` action with `(setf (gethash key table) val)` in one call. +Arguments have to be in even numbers forming pairs, e.g.: `(% :x 1 :y 2)`." + (unless (evenp (length pairs)) + (error "% - hash table requires an even number of arguments for key-value pairs.")) + `(load-time-value + (let ((table (make-hash-table :test 'equal))) + ,@(loop for (key val) on pairs by #'cddr + collect `(setf (gethash ,key table) ,val)) + table))) + +(defun keys (hash-table) + "Convenience function which returns all keys of hash-table." + (loop for key being the hash-keys of hash-table + collect key)) + +(defun vals (hash-table) + "Convenience function which returns all values from hash-table." + (loop for val being the hash-values of hash-table + collect val)) + +(defun get-in (lookup-item keys &key default) + "Returns the value in nested associative structure (hash-table, list vector)" + (loop for key in keys + for current = lookup-item then next + for next = (cond + ((hash-table-p current) (gethash key current)) + ((listp current) (nth key current)) + ((vectorp current) (elt current key)) + (t nil)) + while next + finally (return (if (and default (not next)) + default + next)))) -- cgit v1.2.3