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)))