From 4da3ad1f569832845b58c3ce35149633a2bb665c Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Thu, 9 Oct 2025 21:58:43 +0300 Subject: Initial commit --- src/hash-tables.lisp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/hash-tables.lisp (limited to 'src/hash-tables.lisp') diff --git a/src/hash-tables.lisp b/src/hash-tables.lisp new file mode 100644 index 0000000..9e41b26 --- /dev/null +++ b/src/hash-tables.lisp @@ -0,0 +1,27 @@ +;; SPDX-License-Identifier: EUPL-1.2 +;; SPDX-FileCopyrightText: 2025 Uko Kokņevičs +(defpackage :ukkoclot/hash-tables + (:use :c2cl) + (:export :alist->hash-table :gethash-lazy :plist->hash-table)) +(in-package :ukkoclot/hash-tables) + +(defun alist->hash-table (alist &rest args &key &allow-other-keys) + (let ((ht (apply #'make-hash-table args))) + (loop for (key . value) in alist do + (setf (gethash key ht) value)) + ht)) + +(defmacro gethash-lazy (key hash-table default-lazy) + (let ((unique (gensym "UNIQUE-")) + (res (gensym "RES-"))) + `(let* ((,unique ',unique) + (,res (gethash ,key ,hash-table ,unique))) + (if (eq ,res ,unique) + ,default-lazy + ,res)))) + +(defun plist->hash-table (plist &rest args &key &allow-other-keys) + (let ((ht (apply #'make-hash-table args))) + (loop for (key value) on plist by #'cddr do + (setf (gethash key ht) value)) + ht)) -- cgit v1.2.3