(require 'byte-opt) ;Set up the `side-effect-free' properties
(defcustom safe-functions nil
- "t to disable all safety checks, or a list of assumed-safe functions."
+ "t to disable `unsafep', or a list of assumed-safe functions."
:group 'lisp
:type '(choice (const :tag "No" nil) (const :tag "Yes" t) hook))
(defvar unsafep-vars nil
- "Dynamically-bound list of variables that have lexical bindings at this
-point in the parse.")
+ "Dynamically-bound list of variables with lexical bindings at this point
+in the parse.")
(put 'unsafep-vars 'risky-local-variable t)
;;Side-effect-free functions from subr.el
;;;###autoload
(defun unsafep (form &optional unsafep-vars)
- "Return nil if evaluating FORM couldn't possibly do any harm; otherwise
-result is a reason why FORM is unsafe. UNSAFEP-VARS is a list of symbols
-with local bindings."
+ "Return nil if evaluating FORM couldn't possibly do any harm;
+otherwise result is a reason why FORM is unsafe. UNSAFEP-VARS is a list
+of symbols with local bindings."
(catch 'unsafep
(if (or (eq safe-functions t) ;User turned off safety-checking
(atom form)) ;Atoms are never unsafe
(defun unsafep-function (fun)
- "Return nil if FUN is a safe function (either a safe lambda or a
-symbol that names a safe function). Otherwise result is a reason code."
+ "Return nil if FUN is a safe function
+\(either a safe lambda or a symbol that names a safe function). Otherwise
+result is a reason code."
(cond
((eq (car-safe fun) 'lambda)
(unsafep fun unsafep-vars))
`(function ,fun))))
(defun unsafep-progn (list)
- "Return nil if all forms in LIST are safe, or the reason for the first
-unsafe form."
+ "Return nil if all forms in LIST are safe, or the reason
+for the first unsafe form."
(catch 'unsafep-progn
(let (reason)
(dolist (x list)
(if reason (throw 'unsafep-progn reason))))))
(defun unsafep-let (clause)
- "CLAUSE is a let-binding, either SYM or (SYM) or (SYM VAL). Throws a
-reason to `unsafep' if VAL isn't safe. Returns SYM."
+ "CLAUSE is a let-binding, either SYM or (SYM) or (SYM VAL). Checks VAL
+and throws a reason to `unsafep' if unsafe. Returns SYM."
(let (reason sym)
(if (atom clause)
(setq sym clause)
sym))
(defun unsafep-variable (sym global-okay)
- "Returns nil if SYM is lexically bound or is a non-risky buffer-local
-variable, otherwise a reason why it is unsafe. Failing to be locally bound
+ "Returns nil if SYM is safe as a let-binding sym
+\(because it already has a temporary binding or is a non-risky buffer-local
+variable), otherwise a reason why it is unsafe. Failing to be locally bound
is okay if GLOBAL-OKAY is non-nil."
(cond
((not (symbolp sym))