是否可以在Clojure中删除集合中的最后一个元素


(defn dropit
[input]                         ;Assume input is '(This is (my input (and you (are awesome))))
(drop-last input)              ;returns -> (This is)
)

在上面的函数中,drop-last不会做你认为它会做的事情。有没有办法只从输入中删除最后一个元素,所以返回值是:(这是(我的输入(和你((

有一个简单的函数可以写吗?

除非使用sorted-set,否则集合在clojure中没有顺序保证,因此在集合上使用drop-last时可能会出现意外结果。如果你有一个排序的集合,你可以把最后一个放到它上面。

也就是说,代码注释中的示例数据根本不是一个集合,而是一个列表,根据您的输入,您看到的输出是预期的,因为该列表中有三个元素,最后一个是列表本身,它有自己的元素:

first => "This"
second => "is"
last => ("my" "input" ("and" "you" ("are" "awesome")))

在这里去掉最后一个应该得到(This is),这就是您所指示的正在发生的情况。

如果您想删除内部列表'("are" "awesome"),您可以按照注释中给出的一些遍历建议进行操作。此外,如果你不介意让你的输入成为向量,你可以对它进行一些联想运算,从臀部拍摄,比如:

(assoc 
input 
(- (count input) 1)
(->> input
(take-last 1)
first
(drop-last 1)))

最新更新