User Tools


Differences

This shows you the differences between two versions of the page.

Link to this comparison view

cl:macros:defun [2019/07/14 17:00]
cl:macros:defun [2019/10/19 05:00] (current)
Line 1: Line 1:
 +====== Macro DEFUN ======
 +
 +====Syntax====
 +  * **defun** //​function-name lambda-list <​nowiki>​[[</​nowiki>​declaration''​*''​ | documentation<​nowiki>​]]</​nowiki>​ form''​*''//​ → //​function-name//​
 +
 +====Arguments and Values====
 +  * //​function-name//​ - a //​[[CL:​Glossary:​function name]]//.
 +  * //​lambda-list//​ - an //​[[CL:​Glossary:​ordinary lambda list]]//.
 +  * //​declaration//​ - a **[[CL:​Special Operators:​declare]]** //​[[CL:​Glossary:​expression]]//;​ not evaluated.
 +  * //​documentation//​ - a //​[[CL:​Glossary:​string]]//;​ not evaluated.
 +  * //forms// - an //​[[CL:​Glossary:​implicit progn]]//.
 +  * //​block-name//​ - the //​[[CL:​Glossary:​function block name]]// of the //​function-name//​.
 +
 +====Description====
 +Defines a new //​[[CL:​Glossary:​function]]//​ named //​function-name//​ in the //​[[CL:​Glossary:​global environment]]//​. The body of the //​[[CL:​Glossary:​function]]//​ defined by **defun** consists of //forms//; they are executed as an //​[[CL:​Glossary:​implicit progn]]// when the //​[[CL:​Glossary:​function]]//​ is called.
 +
 +**defun** can be used to define a new //​[[CL:​Glossary:​function]]//,​ to install a corrected version of an incorrect definition, to redefine an already-defined //​[[CL:​Glossary:​function]]//,​ or to redefine a //​[[CL:​Glossary:​macro]]//​ as a //​[[CL:​Glossary:​function]]//​.
 +
 +**defun** implicitly puts a **[[CL:​Special Operators:​block]]** named //​block-name//​ around the body //forms// (but not the //​[[CL:​Glossary:​forms]]//​ in the //​lambda-list//​) of the //​[[CL:​Glossary:​function]]//​ defined.
 +
 +//​documentation//​ is attached as a //​[[CL:​Glossary:​documentation string]]// to //name// (as kind **[[CL:​Types:​function]]**) and to the //​[[CL:​Glossary:​function]]//​ //​[[CL:​Glossary:​object]]//​.
 +
 +Evaluating **defun** causes //​function-name//​ to be a global name for the //​[[CL:​Glossary:​function]]//​ specified by the //​[[CL:​Glossary:​lambda expression]]//​
 +
 +<​blockquote>​
 +([[CL:​Macros:​lambda]] //​lambda-list <​nowiki>​[[</​nowiki>​declaration''​*''​ | documentation<​nowiki>​]]</​nowiki>//​
 +  ([[CL:​Special Operators:​block]] //​block-name//​ form''​*''​))
 +</​blockquote>​
 +
 +processed in the //​[[CL:​Glossary:​lexical environment]]//​ in which **defun** was executed. (None of the arguments are evaluated at macro expansion time.)
 +
 +**defun** is not required to perform any compile-time side effects. In particular, **defun** does not make the //​[[CL:​Glossary:​function]]//​ definition available at compile time. An //​[[CL:​Glossary:​implementation]]//​ may choose to store information about the //​[[CL:​Glossary:​function]]//​ for the purposes of compile-time error-checking (such as checking the number of arguments on calls), or to enable the //​[[CL:​Glossary:​function]]//​ to be expanded inline.
 +
 +====Examples====
 +<​blockquote>​
 +([[CL:​Macros:​defun]] recur (x)
 +  ([[CL:​Macros:​when]] ([[CL:​Functions:​math-greater|>​]] x 0)
 +    (recur ([[CL:​Functions:​one-minus|1-]] x))))
 +<​r>​RECUR</​r>​
 +([[CL:​Macros:​defun]] ex (a b &​optional c (d 66) &rest keys &key test (start 0))
 +  ([[CL:​Functions:​list]] a b c d keys test start)) ​
 +<​r>​EX</​r>​
 +(ex 1 2) <r>(1 2 NIL 66 NIL NIL 0)</​r>​
 +(ex 1 2 3 4 :test '​[[CL:​Functions:​equal]] :start 50) 
 +<r>(1 2 3 4 (:TEST [[CL:​Functions:​EQUAL]] :START 50) [[CL:​Functions:​EQUAL]] 50)</​r>​
 +(ex :test 1 :start 2) <​r>​(:​TEST 1 :START 2 NIL NIL 0)</​r>​
 +</​blockquote>​
 +
 +The below function assumes its callers have checked the types of the arguments, and authorizes the compiler to build in that assumption.
 +
 +<​blockquote>​
 +([[CL:​Macros:​defun]] discriminant (a b c)
 +  ([[CL:​Special Operators:​declare]] ([[CL:​Types:​number]] a b c))
 +  "​Compute the discriminant for a quadratic equation."​
 +  ([[CL:​Functions:​math-subtract|-]] ([[CL:​Functions:​math-multiply|*]] b b) ([[CL:​Functions:​math-multiply|*]] 4 a c))) 
 +<​r>​DISCRIMINANT</​r>​
 +  ​
 +(discriminant 1 2/3 -2) <​r>​76/​9</​r>​
 +</​blockquote>​
 +
 +The below function assumes its callers have not checked the types of the arguments, and performs explicit type checks before making any assumptions.
 +
 +<​blockquote>​
 +([[CL:​Macros:​defun]] careful-discriminant (a b c)
 +  "​Compute the discriminant for a quadratic equation."​
 +  ([[CL:​Macros:​check-type]] a [[CL:​Types:​number]])
 +  ([[CL:​Macros:​check-type]] b [[CL:​Types:​number]])
 +  ([[CL:​Macros:​check-type]] c [[CL:​Types:​number]])
 +  ([[CL:​Special Operators:​locally] ([[CL:​Special Operators:​declare]] ([[CL:​Types:​number]] a b c))
 +    ([[CL:​Functions:​math-subtract|-]] ([[CL:​Functions:​math-multiply|*]] b b) ([[CL:​Functions:​math-multiply|*]] 4 a c)))) 
 +<​r>​CAREFUL-DISCRIMINANT</​r>​
 +
 +(careful-discriminant 1 2/3 -2) <​r>​76/​9</​r>​
 +</​blockquote>​
 +
 +====Affected By====
 +None.
 +
 +====Exceptional Situations====
 +None.
 +
 +====See Also====
 +  * **[[CL:​Special Operators:​flet|Special Operator FLET]]**
 +  * **[[CL:​Special Operators:​labels|Special Operator LABELS]]**
 +  * **[[CL:​Special Operators:​block|Special Operator BLOCK]]**
 +  * **[[CL:​Special Operators:​return-from|Special Operator RETURN-FROM]]**
 +  * **[[CL:​Special Operators:​declare|Special Operator DECLARE]]**
 +  * **[[CL:​Functions:​documentation|Generic Function DOCUMENTATION]]**
 +  * {\secref\Evaluation}
 +  * {\secref\OrdinaryLambdaLists}
 +  * {\secref\DocVsDecls}
 +
 +====Notes====
 +**[[CL:​Special Operators:​return-from]]** can be used to return prematurely from a //​[[CL:​Glossary:​function]]//​ defined by **defun**.
 +
 +Additional side effects might take place when additional information (typically debugging information) about the function definition is recorded.
 +
 +\issue{COMPILE-FILE-HANDLING-OF-TOP-LEVEL-FORMS:​CLARIFY} \issue{DECLS-AND-DOC} \issue{FUNCTION-NAME:​LARGE} \issue{DEFMACRO-BLOCK-SCOPE:​EXCLUDES-BINDINGS} \issue{DOCUMENTATION-FUNCTION-BUGS:​FIX}