% Accessor SYMBOL-FUNCTION
Accessor SYMBOL-FUNCTION
symbol-function
symbol => contents
(setf
(symbol-function
symbol) new-contents)
symbol - シンボル
contents - もしsymbolがマクロか特殊オペレーターとして
グローバルに宣言されているものならば、
実装依存の性質と固有値であるオブジェクトが返却されます。
もしsymbolがマクロか特殊オペレーターとしてグローバルに
宣言されていないのであれば、
そのsymbolはfbound
であり、関数オブジェクトが返却されます。
new-contents - 関数
symbolの関数セルにアクセスします。
(symbol-function 'car) => #<FUNCTION CAR>
(symbol-function 'twice) はエラー ;なぜならTWICEは定義されていない
(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
なし。
symbolがシンボルではないとき、
型type-error
のエラーが発生します。
もしsymbolがfbound
ではなく、
その定義を読み込もうとしたとき、
undefined-function
が通知されます。
(その定義を書き込もうとしたときに発生するエラーはありません)
fboundp
,
fmakunbound
,
macro-function
,
special-operator-p
symbol-function
は、
flet
かlabels
によって生成された
レキシカルな関数の値にアクセスできません。
それはただグローバルな関数の値にのみアクセスできます。
setf
は、symbol-function
とともに使用することで、
symbolの関数定義が特殊オペレーターとして表現されていない場合は、
グローバルな関数定義を置き換えます。
(symbol-function symbol) == (fdefinition symbol)
しかし、fdefinition
は、引数にシンボル以外を受け付けます。