0

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

2 回答 2

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 特殊形式的文档。

于 2013-09-25T23:06:33.500 回答
0

conson a list 将一个元素放在最前面。first将元素从前面取下。

你可以把这段代码中发生的事情想象成有两堆盘子——一开始是空的。你把上面的一个拿下来,然后把它放在另一个上面。你重复直到只有一堆。现在位于顶部的元素现在位于底部,反之亦然,顺序颠倒。

于 2013-09-25T23:07:31.777 回答