Clojure相当于Lisp的原子功能

时间:2014-12-19 02:12:45

标签: clojure lisp

我有这个Lisp代码,我试图将其转换为Clojure代码。

(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的atom函数吗?

1 个答案:

答案 0 :(得分:1)

我认为你会发现这种行为恰当:

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

不同之处在于nil - (rest nil) ()最终不会再发生,但((complement coll?) nil)会返回true,所以尽早停止递归。