2013-09-25 36 views
0

我想學習clojure,我遇到了這段代碼。任何人都可以解釋究竟發生了什麼?前面有星號的線條是我需要幫助理解的線條。謝謝!理解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))))) 

回答

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的文檔。

0

cons在列表中放置一個元素在前面。 first將元素從正面取下。

你可以把那個代碼裏發生的事情描繪成有兩堆盤子 - 一個開始是空的。你拿掉一個,然後把它放在另一個上面。你重複,直到只有一堆。現在,位於頂部的元素現在位於底部,反之亦然,順序相反。