Common Lispには、関数と値の異なる名前空間があります。
関数名前空間で関数を定義するには、、、DEFUN
およびその他を使用します。FLET
LABELS
関数オブジェクトを値として取得する場合は、を使用しますFUNCTION
。
(defun foo (x) (1+ x))
(function foo) -> #<the function foo>
以下:
#'foo -> #<the function foo>
関数を呼び出したい場合は、を記述し(foo 100)
ます。
関数を値として呼び出したい場合は、FUNCALL
またはAPPLY
:を使用する必要があります。
(funcall #'foo 1)
関数を渡して呼び出すことができます。
(defun bar (f arg)
(funcall f arg arg))
(bar #'+ 2) -> 4
DEFUNの場合:
そうではありません(setf (symbol-value 'FOO) (lambda ...))
。
のようなもの(setf (symbol-function 'foo) (lambda ...))
です。
2つの名前空間を使用すると、次のように記述できることに注意してください。
(defun foo (list)
(list list))
(foo '(1 2 3)) -> ((1 2 3))
組み込み関数LIST
と変数の間に競合はありませんLIST
。2つの異なる名前空間があるため、2つの異なる目的に同じ名前を使用できます。
ローカル関数の場合、シンボルが含まれていないことにも注意してください。名前空間は必ずしもシンボルに関連付けられているわけではありません。したがって、ローカル変数の場合、シンボル名を介した関数ルックアップはできません。