Variable: majutsu-template--no-special-expansion

majutsu-template--no-special-expansion is a variable defined in majutsu-template.el.

Value

majutsu-template-no-special-expansion

Documentation

Sentinel returned when no syntax special matches an operator.

Source Code

;; Defined in /nix/store/jagqw3nms546pad0gxi5f3wsckk6pji7-emacs-packages-deps/share/emacs/site-lisp/majutsu-template.el
;;;; Syntax specials

(eval-and-compile
  (defconst majutsu-template--no-special-expansion
    (make-symbol "majutsu-template-no-special-expansion")
    "Sentinel returned when no syntax special matches an operator.")

  (defvar majutsu-template--special-registry (make-hash-table :test #'eq)
    "Registry mapping exact syntax operators to expansion functions.")

  (defvar majutsu-template--special-resolvers nil
    "List of pattern-based syntax special resolver functions.")

  (defun majutsu-template-define-special (name expander)
    "Register syntax special NAME handled by EXPANDER.
EXPANDER receives raw operator arguments and returns a lowered form or node."
    (unless (symbolp name)
      (user-error "majutsu-template: special name must be a symbol, got %S" name))
    (unless (or (functionp expander) (symbolp expander))
      (user-error "majutsu-template: special %S requires a callable expander, got %S"
                  name expander))
    (puthash name expander majutsu-template--special-registry)
    expander)

  (defun majutsu-template-define-special-resolver (resolver)
    "Register pattern-based syntax special RESOLVER.
RESOLVER is called with (OP ARGS) and should return either a lowered form/node
or `majutsu-template--no-special-expansion'."
    (unless (or (functionp resolver) (symbolp resolver))
      (user-error "majutsu-template: special resolver must be callable, got %S" resolver))
    (unless (memq resolver majutsu-template--special-resolvers)
      (setq majutsu-template--special-resolvers
            (append majutsu-template--special-resolvers (list resolver))))
    resolver)

  (defun majutsu-template--expand-special (op args)
    "Expand syntax special OP with raw ARGS, if one exists."
    (or (when-let* ((expander (gethash op majutsu-template--special-registry)))
          (apply expander args))
        (cl-loop for resolver in majutsu-template--special-resolvers
                 for expansion = (funcall resolver op args)
                 unless (eq expansion majutsu-template--no-special-expansion)
                 return expansion)
        majutsu-template--no-special-expansion)))