了解clojure中的浅反转?

时间:2013-09-25 22:53:05

标签: clojure reverse

我正在尝试学习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)))))

2 个答案:

答案 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将元素从前面取出。

你可以想象在那段代码中会发生什么,因为它有两堆牌子 - 一张是空的。你取一个顶部,把它放在另一个顶部。你重复,直到只有一堆。现在位于顶部的元素现在位于底部,反之亦然,顺序相反。