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

この構文は、2 つの異なる実装を持つ関数を定義し、異なるパラメーター リスト (アリティshallow-reverse) で区切られています。この場合、最初のバージョンは、デフォルトのパラメーター値を提供する 2 番目のバージョンを呼び出します。2 番目の実装では、再帰ループを実行して から最初の要素を取得し、の先頭に追加し、 に要素がなくなると終了します。lstreversedlst

このrecur呼び出しは、現在の関数を呼び出す最適化ですloop。存在する場合は、追加のスタック フレームを使用せずに呼び出します。

他の言語では、同じ名前で 2 つの別個の関数を定義します。

//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のドキュメントを参照してください。

于 2013-09-25T23:06:33.500 に答える
0

consリスト上の要素を先頭に配置します。first要素を前面から取り外します。

そのコードで何が起こるかを想像することができます.2つのプレートの山があり、1つは空から始まります. あなたは一方から上を取り、もう一方の上に置きます。山が1つになるまで繰り返します。上にあった要素が下になり、順序が逆になります。

于 2013-09-25T23:07:31.777 に答える