+ (prog1
+ (defconst (, name) (,@ everything-else))
+ (put (quote (, name)) 'defconst-maybe t))))))
+
+(defmacro defun-maybe-cond (name args &optional doc &rest everything-else)
+ (or (stringp doc)
+ (setq everything-else (cons doc everything-else)
+ doc nil))
+ (or (and (fboundp name)
+ (not (get name 'defun-maybe)))
+ (` (or (fboundp (quote (, name)))
+ (prog1
+ (cond (,@ (mapcar (function
+ (lambda (case)
+ (list (car case)
+ (if doc
+ (` (defun (, name) (, args)
+ (, doc)
+ (,@ (cdr case))))
+ (` (defun (, name) (, args)
+ (,@ (cdr case))))))))
+ everything-else)))
+ (put (quote (, name)) 'defun-maybe t))))))
+
+(defmacro defmacro-maybe-cond (name args &optional doc &rest everything-else)
+ (or (stringp doc)
+ (setq everything-else (cons doc everything-else)
+ doc nil))
+ (or (and (fboundp name)
+ (not (get name 'defmacro-maybe)))
+ (` (or (fboundp (quote (, name)))
+ (prog1
+ (cond (,@ (mapcar (function
+ (lambda (case)
+ (list (car case)
+ (if doc
+ (` (defmacro (, name) (, args)
+ (, doc)
+ (,@ (cdr case))))
+ (` (defmacro (, name) (, args)
+ (,@ (cdr case))))))))
+ everything-else)))
+ (put (quote (, name)) 'defmacro-maybe t))))))
+
+(defsubst subr-fboundp (symbol)
+ "Return t if SYMBOL's function definition is a built-in function."
+ (and (fboundp symbol)
+ (subrp (symbol-function symbol))))