我有这个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
函数吗?
答案 0 :(得分:1)
我认为你会发现这种行为恰当:
(def single-valued? (complement coll?))
不同之处在于nil
- (rest nil)
()
最终不会再发生,但((complement coll?) nil)
会返回true
,所以尽早停止递归。