lisp - 从逻辑列表中选择。口齿不清

标签 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)
    )
)

提前谢谢你。

最佳答案

这很容易使用 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 当您想使用映射函数有条件地添加列表元素时,它是一个有用的函数。该函数返回一个列表,并将它们全部连接起来以创建最终结果,因此如果它不想添加任何内容,它可以返回一个空列表。

关于lisp - 从逻辑列表中选择。口齿不清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40619551/

相关文章:

lisp - 为什么 LISP 在使用 IF 语句的函数中打印 NIL?

recursion - 是否有可能在 Lisp 中递归生成 40,000 多个斐波那契数列?

lisp - 什么时候在 Lisp 中更喜欢 gensym 而不是 make-symbol

lisp - 普通口齿不清 : How to quote parenthese in SBCL

lisp - 查找树中子节点的最大数量

printing - 为什么 print-circle 默认为 nil?

list - 使用迭代递归函数在 Lisp 中构建列表

lisp - 多个列表的计算函数

Lisp语言初学者详解

scheme - '(list 1 2) 在 Scheme 中是什么意思?