gpt4 book ai didi

functional-programming - 使用 lisp 函数

转载 作者:太空宇宙 更新时间:2023-11-03 18:46:24 25 4
gpt4 key购买 nike

我正在尝试编写一个返回列表中原子列表的函数,假设我有一个列表,其中包含原子和列表,当我运行该函数时,它应该返回一个原子列表。 .

例如:

(func '(2 34 5 (12) 7 (A B C) +))
-> (2 34 7 +)

我想尝试结果中的参数是否为真,以便在我运行时:

(ATOM ( (func '(2 34 5 (12) 7 (A B C) +)) )
->T

关于我该如何着手的任何想法?书籍或引用资料?

最佳答案

使用标准的 CL 函数,

[3]> (remove-if-not #'atom '(1 2 (12) +))
(1 2 +)

[6]> (every #'atom (remove-if-not #'atom '(1 2 (12) +)))
T

如果你想自己写,你可以融合 #'atom 并创建两个专门的函数,比如 remove-atomsevery-is -原子。但是“atom”是一个 built-in function atom 的名称.

第一种写法是

(defun remove-atoms (xs &aux (ys (list 1)))
(let ((p ys))
(dolist (x xs (cdr ys))
(if (atom x) (setf (cdr p) (list x) p (cdr p))))))

这使用破坏性更新以自上而下的方式构建结果列表,此处不违反函数式编程的精神,因为它是在本地使用的,作为一种实现技术。这可以看作是通用函数式 tail-recursive-modulo-cons 的 Common-LISP 特定翻译来自另一个答案的代码。

第二个函数:

(defun every-is-atom (xs)
(dolist (x xs T)
(if (not (atom x))
(return-from every-is-atom NIL))))

关于functional-programming - 使用 lisp 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12996307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com