It isn't difficult to make your own let-plist
by referring to let-alist.el
, here is my attempt, the mainly difference is let-plist--list-to-sexp
.
(require 'let-alist)
(defun let-plist--list-to-sexp (list var)
"Turn symbols LIST into recursive calls to `plist-get' on VAR."
`(plist-get ,(if (cdr list)
(let-plist--list-to-sexp (cdr list) var)
var)
',(intern (concat ":" (symbol-name (car list))))))
(defun let-plist--access-sexp (symbol variable)
"Return a sexp used to access SYMBOL inside VARIABLE."
(let* ((clean (let-alist--remove-dot symbol))
(name (symbol-name clean)))
(if (string-match "\\`\\." name)
clean
(let-plist--list-to-sexp
(mapcar #'intern (nreverse (split-string name "\\.")))
variable))))
(defmacro let-plist (plist &rest body)
(declare (indent 1))
(let ((var (make-symbol "plist")))
`(let ((,var ,plist))
(let ,(mapcar (lambda (x) `(,(car x) ,(let-plist--access-sexp (car x) var)))
(delete-dups (let-alist--deep-dot-search body)))
,@body))))
Here are some uses.
(let-plist '(:foo 1 :bar 2)
.bar)
;; => 2
(let-plist '(:question (:title
"Equivalent of let-alist for plists?"
:id
"45581"
:tags
("property-lists")))
.question.title)
;; => "Equivalent of let-alist for plists?"