### symbol-function (Accessor)

##### Syntax:

— Function:

**symbol-function**` symbol `→` contents`
`(setf (symbol-function symbol) new-contents)`

##### Arguments and Values:

`symbol`—a *symbol*.

`contents`—
If the `symbol` is globally defined as a *macro* or a *special operator*,
an *object* of *implementation-dependent* nature and identity is returned.
If the `symbol` is not globally defined as
either a *macro* or a *special operator*,
and
if the `symbol` is *fbound*,
a *function* *object* is returned.

`new-contents`—a *function*.

##### Description:

*Accesses* the *symbol*'s *function cell*.

##### Examples:

(symbol-function 'car) → #<FUNCTION CAR>
(symbol-function 'twice) is an error ;because TWICE isn't defined.
(defun twice (n) (* n 2)) → TWICE
(symbol-function 'twice) → #<FUNCTION TWICE>
(list (twice 3)
(funcall (function twice) 3)
(funcall (symbol-function 'twice) 3))
→ (6 6 6)
(flet ((twice (x) (list x x)))
(list (twice 3)
(funcall (function twice) 3)
(funcall (symbol-function 'twice) 3)))
→ ((3 3) (3 3) 6)
(setf (symbol-function 'twice) #'(lambda (x) (list x x)))
→ #<FUNCTION anonymous>
(list (twice 3)
(funcall (function twice) 3)
(funcall (symbol-function 'twice) 3))
→ ((3 3) (3 3) (3 3))
(fboundp 'defun) → *true*
(symbol-function 'defun)
→ *implementation-dependent*
(functionp (symbol-function 'defun))
→ *implementation-dependent*
(defun symbol-function-or-nil (symbol)
(if (and (fboundp symbol)
(not (macro-function symbol))
(not (special-operator-p symbol)))
(symbol-function symbol)
nil)) → SYMBOL-FUNCTION-OR-NIL
(symbol-function-or-nil 'car) → #<FUNCTION CAR>
(symbol-function-or-nil 'defun) → NIL

##### Affected By:

`defun`

##### Exceptional Situations:

Should signal an error of *type* `type-error`

if `symbol` is not a *symbol*.

Should signal `undefined-function`

if `symbol` is not *fbound*
and an attempt is made to *read* its definition. (No such error is signaled
on an attempt to *write* its definition.)

##### See Also:

fboundp,
fmakunbound,
macro-function,
special-operator-p

##### Notes:

`symbol-function`

cannot *access* the value of a lexical function name
produced by `flet`

or `labels`

; it can *access* only
the global function value.

`setf`

may be used with
`symbol-function`

to replace a global function
definition when the *symbol*'s function definition
does not represent a *special operator*.

(symbol-function `symbol`) ≡ (fdefinition `symbol`)

However, `fdefinition`

accepts arguments other than just *symbols*.