EVERY関数を使用できます。
(every #'identity '(T T T T T)) -> T
と
(every #'identity '(T T T T NIL)) -> NIL
おそらく最も効率的な方法は、LOOPを使用することです。
(loop for element in '(T T T T nil) always element) -> NIL
利点は、リスト要素に対する関数呼び出しが必要ないことです。
#'
式の読み取り中にFUNCTIONに展開される読み取りマクロです。#'and
(FUNCTION AND)もそうです。
機能はここで説明されています:http ://www.lispworks.com/documentation/HyperSpec/Body/s_fn.htm
FUNCTIONは、関数名またはラムダ式を受け取り、対応する関数オブジェクトを返します。
ANDはここで定義されます: http ://www.lispworks.com/documentation/HyperSpec/Body/m_and.htm
ANDはマクロであり、関数ではないということです。その結果、対応する関数オブジェクトを返すためにFUNCTIONにはマクロではなく関数が必要になるため、(FUNCTION AND)は機能しません。sepp2kが彼の回答で説明しているように、LAMBDAを使用して関数を作成し、その関数内でマクロANDを使用できます。マクロを値として渡すことはできず、後でFUNCALLまたはAPPLYを介して呼び出すことはできません。これは関数でのみ機能します。
このソリューションは次のように記述されます
(reduce (lambda (x y) (and x y)) (get-some-list))
(lambda (...) ...)
LAMBDAは、に展開される マクロです(function (lambda (...) ...))
。
したがって、上記は実際には次のとおりです。
(reduce (function (lambda (x y) (and x y))) (get-some-list))
これは次のように書くことができます
(reduce #'(lambda (x y) (and x y)) (get-some-list))
Common Lispは値と関数の名前空間を区別するため、FUNCTIONが必要です。REDUCEは、関数を引数として値で渡す必要があります。したがって、関数の名前空間から関数を取得する必要があります。これがFUNCTIONの目的です。関数オブジェクトを渡したいときはいつでも、関数名前空間からそれを取得する必要があります。
たとえば、ローカル関数の場合:
(flet ((my-and (x y) (and x y)))
#'my-and)
Common Lispの設計中に、(FUNCTION(LAMBDA ...))に展開されるコンビニエンスマクロとしてのLAMBDAが追加されました。