您可以使用 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
(函数与)也是如此。
功能在这里描述:http ://www.lispworks.com/documentation/HyperSpec/Body/s_fn.htm
FUNCTION 接受函数名或 lambda 表达式并返回相应的函数对象。
AND 在这里定义: http ://www.lispworks.com/documentation/HyperSpec/Body/m_and.htm
它说 AND 是一个宏,而不是一个函数。结果是 (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))
FUNCTION 是必需的,因为 Common Lisp 对值和函数的命名空间有所不同。REDUCE 需要按值获取作为参数传递的函数。所以我们需要从函数命名空间中检索函数——这就是 FUNCTION 的目的。每当我们想要传递一个函数对象时,我们都需要从函数命名空间中获取它。
例如在局部函数的情况下:
(flet ((my-and (x y) (and x y)))
#'my-and)
LAMBDA 作为扩展为 (FUNCTION (LAMBDA ...)) 的便利宏已在 Common Lisp 的设计过程中添加。