Emacs Lisp: Standard way to verify tree structures?

data-structures, elisp, types

Solution

In file `lisp/wid-edit.el` there is this function:

(defun widget-type-match (widget value)
  "Non-nil if the :type value of WIDGET matches VALUE.

The value of the :type attribute should be an unconverted widget type."
  (widget-apply (widget-convert (widget-get widget :type)) :match value))

which you can adapt to your needs:

(defun my-type-match (type value)
  (widget-apply (widget-convert type) :match value))

(my-type-match 'string "foo")
==> t
(my-type-match 'string 10)
==> nil
(my-type-match '(choice (const 1) (const 2) (const t)) 10)
==> nil
(my-type-match '(choice (const 1) (const 2) (const t)) 2)
==> t

Problem

In emacs lisp, various tree structures are common. `custom.el` provides through the `:type` argument to `defcustom` a standard way to define the expected shape of customization variables. But is there a standard way to verify the structure of some random emacs lisp value? Lets say, I have a list of the form ``` LIST = (ENTRY ...) ENTRY = (NAME . ((1 VAL1) (2 VAL2) ...)) ``` can I somehow define that structure similiar to a customization type and then check against that structure definition?

Original source