注:*print-pretty*
はNIL
これらの例です。
(defun where (x)
#'(lambda (item)
(> item x)))
上記の関数where
では、無名関数を作成し、それをクロージャー (関数と の変数バインディングX
) として返しています。値として返すので、 と書く必要があります(FUNCTION (LAMBDA ...))
。#'(lambda ...)
は短い記法ですが、同じ結果になります - リーダーマクロを使用し#'
ます:
CL-USER 74 > (read-from-string "#'(lambda (foo) (1+ foo))")
(FUNCTION (LAMBDA (FOO) (1+ FOO)))
次のように書くこともできます。
(defun where (x)
(lambda (item)
(> item x)))
Common Lisp の定義中に、上記のコードを記述できるように追加されました。形も同じです(function (lambda ...))
。Common Lisp ではLAMBDA
マクロであり、マクロに展開されます。
CL-USER 75 > '(lambda (foo) (1+ foo))
(LAMBDA (FOO) (1+ FOO))
CL-USER 76 > (macroexpand '(lambda (foo) (1+ foo)))
(FUNCTION (LAMBDA (FOO) (1+ FOO)))
T
はマクロLAMBDA
であり、評価者がそれを のように見ると(lambda ...)
、フォームをフォームに展開し、(function (lambda ...))
評価されます。
FUNCTION
は特別な形式であり、評価者がそれを見ると関数オブジェクトを返します - その場合(function (lambda (foo) (1+ foo)))
、無名関数をオブジェクトとして返します:
CL-USER 77 > (function (lambda (foo) (1+ foo)))
#<anonymous interpreted function 406000761C>
つまり、これが(function (lambda ...))
関数オブジェクトを取得するための実際の s-expression 表記であり、#'(lambda ...)
(リーダー マクロを介して) または(lambda ...)
(マクロを介して) どちらも Lisp ソース コードの短い表記であることがわかります。プログラマーが長い形式を使用するのは珍しいことです。ほとんど (99.999%) は、ソース コードで短い表記の 1 つを使用します。
ところで: エバリュエーターがfunction
このような関数の名前を囲んでいるのを見た場合(function sin)
、関数バインディングを検索し、対応する関数オブジェクトを返します。
CL-USER 78 > (function sin)
#<Function SIN 4110083C6C>