common-lisp - 有两种方式展平列表 : (i) using MAPCAN and (ii) using LOOP

标签 common-lisp

我的教授给我们布置了 clisp 的复习作业。一个练习是通过三种方式实现相同的目标: 返回给定列表中所有正整数的扁平列表。

现在,我真的喜欢这样做,只有一种方法,使用 cons 和递归,但他希望我使用 mapcan 和循环来做到这一点(我怀疑 lisp 不是他的首选语言因为这种编码风格感觉非常违背 lisp 的本质)。我很难弄清楚如何使用循环来做到这一点...我想我需要首先启动一个列表?

我对含糊的语言表示歉意,因为我不太确定如何谈论使用函数式语言来编写程序。以下是我的第一次尝试。

(defun posint-loop (l)  
  (loop for i in l
        do (if (listp i)  
               (posint-loop i)  
               (if (integerp i)  
                   (if (> i 0)  
                       (append i) ; this doesn't work because there's nothing to
                                  ; start appending to!
                       nil)  
                   nil))))

最佳答案

为了建立新的词法绑定(bind),请使用 letwith loop 的关键字。为了扩展现有列表,您可能需要使用 push ;如果您需要原单,可以nreverse新列表finally .

另一种方法是使用 whencollect loop的关键词.

另一个提示:mapcan隐式创建一个新列表。

关于common-lisp - 有两种方式展平列表 : (i) using MAPCAN and (ii) using LOOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3679219/

相关文章:

list - 如何用 nil 创建点对

lisp - Lisp 中的快速排序奇怪的行为?

clojure - Common Lisp 中的原子和符号有什么区别?

return - 订单与SBCL中的返回有关

macros - 宏发出 : Eval of a macro body works, 但宏没有

data-structures - 什么时候以及为什么要在 CL 中使用哈希表而不是 a-lists?

set - 奇怪的 Common Lisp 交叉行为

data-structures - 在 Common Lisp 中销毁结构或类

python - 如何在 lisp 中定义这样的常量?

lisp - 调试级 Lisp