如何在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)
)
)
提前谢谢。
答案 0 :(得分:1)
使用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
是一个有用的函数。该函数返回一个列表,并且它们全部连接在一起以创建最终结果,因此如果它不想添加某些内容,它可以返回一个空列表。