我正在尝试学习clojure,我遇到了这段代码。任何人都能解释究竟发生了什么吗?前面有星星的线条是我需要帮助理解的线条。谢谢!
(defn shallow-reverse
"Reverses the top level elements of lst"
*([lst]
(shallow-reverse () lst))
*([reversed lst]
(cond
(empty? lst) reversed
:else (recur (cons (first lst) reversed) (rest lst)))))
答案 0 :(得分:3)
语法定义了一个函数shallow-reverse
,它有两个不同的实现,由不同的参数列表分隔,或arity。在这种情况下,第一个版本调用第二个版本提供默认参数值。第二个实现在自身上执行递归循环,以从lst
获取第一个元素并将其添加到reversed
的前面,并在lst
中没有更多元素时结束。
recur
调用是调用当前函数的优化,如果存在则调用loop
,而不使用额外的堆栈帧。
在其他语言中,您将定义两个具有相同名称的独立函数。
//Note: Pseudo code, not valid Java
public List<int> shallowReverse(List<int> lst) {
return shallowReverse(new List<int>(), lst);
}
public List<int> shallowReverse(List<int> reversed, List<int> lst) {
if(lst.size() < 1) return reversed;
return shallowReverse(...);
}
有关详细信息,请查看fn special form上的文档。
答案 1 :(得分:0)
cons
会在前面放置一个元素。 first
将元素从前面取出。
你可以想象在那段代码中会发生什么,因为它有两堆牌子 - 一张是空的。你取一个顶部,把它放在另一个顶部。你重复,直到只有一堆。现在位于顶部的元素现在位于底部,反之亦然,顺序相反。