如何解决从循环宏进行递归调用
对于Lisp来说,我还很陌生,并且一直困扰于一个特定的问题。我想编写的函数需要两个参数:一个函数和一个List。它遍历列表,并在列表中的每个元素上调用给定的函数。如果函数返回true,则将元素添加到返回的子列表中
到目前为止,我尝试过的是:
(defun myFunc(f l)
(loop for x in l
if (listp x) do (myFunc f x)
else if (eql t (funcall f x))
collect x
)
)
我为f提供的函数带有一个参数,如果它是一个数字,则返回true。到目前为止,如果aList是一个简单的列表,例如(1 2 3),我的代码就可以工作。但是,当我输入类似(1 2(4 5)7)的嵌套列表时,仅输出(1 2 7)而不是(1 2(4 5)7)。
我假设它与我的递归调用以及返回的内容有关。非常感谢您提供一些帮助
解决方法
有两个小问题。首先,我认为这只是一个错字,但是您需要将aFunc
替换为f
(因为您的代码中没有变量aFunc
)。
现在是问题的重点。在您的else if
分支中,当谓词为true时,您可以正确collect
的值。但是在递归的情况下,您只需要运行一些代码并丢弃结果即可。您也想在这里collect
。
(defun myFunc (f l)
(loop for x in l
if (listp x)
collect (myFunc f x)
else if (eql t (funcall f x))
collect x))
最后,只是一个样式说明。如果谓词返回任何真值,而不仅仅是t
,则将谓词视为真通常是惯用的。因此,如果我正在写这篇文章,我可能会用简单的(eql t (funcall f x))
代替(funcall f x)
。如果这是一项家庭作业,并且老师告诉您以其他方式进行,请坚持下去。但是,如果这是为了您的利益,您也可以考虑对其进行更改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。