如何在 Common lisp 中实现这一点?
(logselect (t nil t) (list1 list2 list3)) ---> (list1 list2)
我编写了以下函数,但我认为有更好的方法(也许是内置函数?)。
(defun logselect (loglist lista)
(let ((listaL) (maskL) (toremove))
(setq listaL (mapcar #'list lista))
(setq maskL (mapcar #'cons loglist listaL))
(setq toremove (mapcar #'(lambda (x) (car (and (car x) (cdr x)))) maskL))
(remove nil toremove)
)
)
提前谢谢你。
这很容易使用 LOOP
完成:
(defun logselect (loglist lista)
(loop for test in loglist
for value in lista
when test collect value))
如果您更喜欢更“lispy”的解决方案,您可以使用 mapcan
来实现:
(defun logselect (loglist lista)
(mapcan #'(lambda (test value)
(when test (list value)))
loglist lista))
mapcan
当您想使用映射函数有条件地添加列表元素时,它是一个有用的函数。该函数返回一个列表,并将它们全部连接起来以创建最终结果,因此如果它不想添加任何内容,它可以返回一个空列表。
我是一名优秀的程序员,十分优秀!