我的教授给我们布置了 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),请使用 let
或with
loop
的关键字。为了扩展现有列表,您可能需要使用 push
;如果您需要原单,可以nreverse
新列表finally
.
另一种方法是使用 when
和 collect
loop
的关键词.
另一个提示:mapcan
隐式创建一个新列表。
关于common-lisp - 有两种方式展平列表 : (i) using MAPCAN and (ii) using LOOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3679219/