有没有办法在 Clojure 中返回集合的最后一个元素?

0 clojure

user-> (last '(First (Second (Last))))
-> (Second (Last))
Run Code Online (Sandbox Code Playgroud)

我通常会假设这个 ^ 只会返回(最后)。为什么是这样?有没有办法只返回 (Last) 或 Last。

还有什么对于:

(defn function
 [input]              ;assume input = '(First (Second (Last)))

 (last input)

 )
Run Code Online (Sandbox Code Playgroud)

Den*_*ida 6

严格来说,(First (Second (Last)))不是Set,而是List。Set 是没有重复的元素的集合,并且不需要元素的排序。

如果仔细观察,它是一个包含 2 个元素的列表。第一个元素是符号First,第二个元素本身就是一个列表:(Second (Last))

Clojure 的基本思想之一是序列抽象:多种集合数据类型允许您一次获取一个元素。您可以seq在 HashMaps、Sets、Vectors 和 Lists 等集合中调用该函数。

在您的情况下,您有一个嵌套的数据集合:一个列表,其中一个元素是一个列表,依此类推...

对于嵌套数据结构,您可以使用tree-seq,它将一次遍历您的嵌套列表一个元素,在需要时进入嵌套集合。tree-seq接受 2 或 3 个参数:一个可选函数,用于确定一个元素是否是一个分支(例如,包含其他元素),获取一个分支的子元素的函数,以及要遍历的集合。


(tree-seq sequential? identity '(First (Second (Last))))

;; Note: Commas added for clarity
;; => ((First (Second (Last))), First, (Second (Last)), Second, (Last), Last)
Run Code Online (Sandbox Code Playgroud)

由此,您可以清楚地提取最后一个元素last

(last (tree-seq sequential? identity '(First (Second (Last)))))
;; => Last
Run Code Online (Sandbox Code Playgroud)