Add some utility functions

This commit is contained in:
2025-09-20 00:54:57 -07:00
parent 7f68c8fcbf
commit bdb4bf6824
2 changed files with 42 additions and 1 deletions

View File

@ -142,3 +142,44 @@
(defmacro return (&opt value)
(list 'return-from nil value))
(defun put (symbol key value)
(setplist symbol (plist-set (symbol-plist symbol) key value)))
(defun get (symbol key &opt default)
(plist-get (symbol-plist symbol) key default))
(defun remprop (symbol key)
(setplist symbol (plist-rem (symbol-plist symbol) key)))
(defmacro dotails (vars &rest body)
(let ((cur (make-symbol "cur")))
(list 'let (list (list cur (second vars)))
(list 'while (list 'pairp cur)
(apply 'list 'let (list (list (first vars) cur))
body)
(list 'setq cur (list 'tail cur))))))
(defun member (elt list &opt (pred 'equal))
(dotails (cur list)
(when (funcall pred elt (head cur))
(return-from member cur))))
(defun member-if (pred list &opt negate)
(dotails (cur list)
(when (or (and (not negate) (funcall pred (head cur)))
(and negate (not (funcall pred (head cur)))))
(return-from member-if cur))))
(defun find (elt list &opt default (pred 'equal))
(dolist (cur list)
(when (funcall pred cur elt)
(return-from find cur)))
default)
(defun find-if (pred list &opt default negate)
(dolist (cur list)
(when (or (and (not negate) (funcall pred cur))
(and negate (not (funcall pred cur))))
(return-from find-if cur)))
default)