Function: defun
defun is a macro defined in byte-run.el.gz.
Signature
(defun NAME ARGLIST &optional DOCSTRING DECL &rest BODY)
Documentation
Define NAME as a function.
The definition is (lambda ARGLIST [DOCSTRING] BODY...).
See also the function interactive.
DECL is a declaration, optional, of the form (declare DECLS...) where
DECLS is a list of elements of the form (PROP . VALUES). These are
interpreted according to defun-declarations-alist.
The return value is undefined.
Probably introduced at or before Emacs version 1.1.
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/byte-run.el.gz
;; Now that we defined defmacro we can use it!
(defmacro defun (name arglist &optional docstring &rest body)
"Define NAME as a function.
The definition is (lambda ARGLIST [DOCSTRING] BODY...).
See also the function `interactive'.
DECL is a declaration, optional, of the form (declare DECLS...) where
DECLS is a list of elements of the form (PROP . VALUES). These are
interpreted according to `defun-declarations-alist'.
The return value is undefined.
\(fn NAME ARGLIST &optional DOCSTRING DECL &rest BODY)"
;; We can't just have `decl' as an &optional argument, because we need
;; to distinguish
;; (defun foo (arg) (toto) nil)
;; from
;; (defun foo (arg) (toto)).
(declare (doc-string 3) (indent 2))
(or name (error "Cannot define '%s' as a function" name))
(if (null
(and (listp arglist)
(null (delq t (mapcar #'symbolp arglist)))))
(error "Malformed arglist: %s" arglist))
(let ((decls (cond
((eq (car-safe docstring) 'declare)
(prog1 (cdr docstring) (setq docstring nil)))
((and (stringp docstring)
(eq (car-safe (car body)) 'declare))
(prog1 (cdr (car body)) (setq body (cdr body)))))))
(if docstring (setq body (cons docstring body))
(if (null body) (setq body '(nil))))
(let ((declarations
(mapcar
#'(lambda (x)
(let ((f (cdr (assq (car x) defun-declarations-alist))))
(cond
(f (apply (car f) name arglist (cdr x)))
;; Yuck!!
((and (featurep 'cl)
(memq (car x) ;C.f. cl-do-proclaim.
'(special inline notinline optimize warn)))
(push (list 'declare x)
(if (stringp docstring)
(if (eq (car-safe (cadr body)) 'interactive)
(cddr body)
(cdr body))
(if (eq (car-safe (car body)) 'interactive)
(cdr body)
body)))
nil)
(t
(macroexp-warn-and-return
(format-message "Unknown defun property `%S' in %S"
(car x) name)
nil)))))
decls))
(def (list 'defalias
(list 'quote name)
(list 'function
(cons 'lambda
(cons arglist body))))))
(if declarations
(cons 'prog1 (cons def declarations))
def))))