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)
严格来说,(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)