2014-12-19 40 views
2

我有這個Lisp代碼,我試圖將它轉換成Clojure代碼。Clojure相當於Lisp的原子函數

(defun copy-tree (tr) 
    (if (atom tr) 
    tr 
    (cons (copy-tree (car tr)) 
      (copy-tree (crd tr))))) 

好像是Clojure中沒有Lisp的原子(或Clojure的原子具有非常不同的意思),我有如下修改代碼。 (Am I using atom? wrong or there is something else....?

(defn single-valued? 
    [x] 
    (not (or (nil? x) 
       (.. x getClass isArray) 
       (some #(instance? % x) [clojure.lang.Counted 
             clojure.lang.IPersistentCollection 
             java.util.Collection 
             java.util.Map])))) 

(defn copy-tree [tr] 
    (if (or (= tr()) (single-valued? tr)) 
    tr 
    (cons (copy-tree (first tr)) 
      (copy-tree (rest tr))))) 

的代碼工作正常,但有更好的辦法來取代Lisp的​​功能?

回答

1

我想你會發現此行爲apropriately:

(def single-valued? (complement coll?)) 

不同的是,它會走出低谷遲早的nil - (rest nil)()它終於不再發生,但((complement coll?) nil)回報true,所以停止遞歸更快一步。

+0

我認爲這裏有一個陷阱與懶序列。但是他們也實現了'IPersistentCollection':'(coll?(range))'=>'true'。好! – Thumbnail 2014-12-19 03:38:40