从逻辑列表中选择。 Common Lisp

时间:2016-11-15 20:56:31

标签: lisp

如何在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)
    )
)

提前谢谢。

1 个答案:

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