npt-japanese

% Accessor SYMBOL-FUNCTION

UP


Accessor SYMBOL-FUNCTION

Accessor SYMBOL-FUNCTION

構文

symbol-function symbol => contents
(setf (symbol-function symbol) new-contents)

引数と戻り値

symbol - シンボル
contents - もしsymbolがマクロか特殊オペレーターとして グローバルに宣言されているものならば、 実装依存の性質と固有値であるオブジェクトが返却されます。 もしsymbolがマクロか特殊オペレーターとしてグローバルに 宣言されていないのであれば、 そのsymbolfboundであり、関数オブジェクトが返却されます。
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

副作用

なし。

影響

defun

例外

symbolがシンボルではないとき、 型type-errorのエラーが発生します。

もしsymbolfboundではなく、 その定義を読み込もうとしたとき、 undefined-functionが通知されます。 (その定義を書き込もうとしたときに発生するエラーはありません)

参考

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

備考

symbol-functionは、 fletlabelsによって生成された レキシカルな関数の値にアクセスできません。 それはただグローバルな関数の値にのみアクセスできます。

setfは、symbol-functionとともに使用することで、 symbolの関数定義が特殊オペレーターとして表現されていない場合は、 グローバルな関数定義を置き換えます。

(symbol-function symbol) ==  (fdefinition symbol)

しかし、fdefinitionは、引数にシンボル以外を受け付けます。


TOP, Github