Вы можете использовать каждую функцию:
(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
(ФУНКЦИЯ И).
ФУНКЦИЯ описана здесь: http://www.lispworks.com/documentation/HyperSpec/Body/s_fn.htm
Функция принимает имя функции или лямбда-выражения и возвращает соответствующий объект функции.
И определяется здесь: http://www.lispworks.com/documentation/HyperSpec/Body/m_and.htm
Он говорит, что и макрос, а не функция. Следствием этого является то, что (FUNCTION AND) не работает, поскольку для функции FUNCTION требуется функция, а не макрос, чтобы возвращать соответствующий объект функции. Как описывает 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 делает разницу между пространством имен для значений и функций. REDUCE должен получить функцию, переданную как аргумент по значению. Поэтому нам нужно получить функцию из пространства имен функций, что является целью FUNCTION. Всякий раз, когда мы хотим передать объект функции, нам нужно получить его из пространства имен функций.
Например, в случае локальной функции:
(flet ((my-and (x y) (and x y)))
#'my-and)
LAMBDA как удобство макроса, развернутый в (FUNCTION (LAMBDA ...)) была добавлена в ходе разработки Common Lisp.
Ваш пример ** неверен **, потому что первый аргумент 'reduce' может быть вызван либо с помощью нуля, либо с двумя аргументами" (см. CL hyperspec). Кроме того, вы не предоставляете никаких «начальных значений». В целом, ваш пример не работает, если вы хотите уменьшить пустой список или списки длиной 1. Правильная версия, например, '(lambda (& optional (x T) (y T)) (и xy))' , –