2012-06-04 69 views
2

什麼是與下面的代碼的問題: 的FUNC表達式獲取包含術語,它包括表達表達...間接遞歸 - Clojure的

(defn term[] 
    (def mytmp (zip/xml-zip {:tag :term})) 
    (cond 
     (= (first(:content(first vecTok))) "(") 
     (do 
      (def mytmp (popVecTo mytmp)) 
      (def mytmp (zip/append-child mytmp (expression))) 
      (def mytmp (popVecTo mytmp))) 
     :else 
      (def mytmp (popVecTo mytmp))) 
    (zip/node mytmp)) 
(defn expression[] 
    (def mytmp (zip/xml-zip {:tag :expression})) 
    (def mytmp (zip/append-child mytmp (term))) 
    (while (contains? #{"+", "-", "*","/", "&", "|", "<", ">", "="} (first(:content(first vecTok)))) 
     (do 
     (def mytmp (popVecTo mytmp)) 
     (def mytmp (zip/append-child mytmp (term))))) 
    (zip/node mytmp)) 
(def vecTok (vec (:content(first(xml-seq (parse "C:/Users/User/Desktop/forHekronot/BallT.xml")))))) 

在文件:

<a><symbol>(</symbol><identifier>dy</identifier><symbol>-</symbol><identifier>dx</identifier><symbol>)</symbol></a> 
+3

使用高清是壞主意,請使用我們。 –

+2

投票結束,因爲沒有解釋我能看到的問題。 –

+1

只是我看到的一些問題。 1)你試圖編寫可變的代碼,而不是採取更多功能的方法。 2)你正在使用'(def ...)'來定義頂層var,而不是使用[let](http://clojuredocs.org/clojure_core/clojure.core/let)和[threading宏](http://clojuredocs.org/clojure_core/clojure.core/-%3E)。 3)你似乎在不斷地重新定義'vecTok',這不是慣用的Clojure。我認爲你需要做的是備份,並將xml流視爲序列,並使用'map','filter'和其他序列抽象操作該序列。 – jszakmeister

回答

0

儘管@ jszakmeister的評論如何更好地解決問題,讓我試着給出和回答這個問題:

你可以先(def expression),然後是(defn term [] ...),最後是(defn expression [] ...)

典型的例子爲間接遞歸當然是窮人的奇/偶正數函數:

clojurec.core=> (def even) 
#'clojurec.core/even 
clojurec.core=> (defn odd [x] (and (not (= x 0)) (even (dec x)))) 
#'clojurec.core/odd 
clojurec.core=> (defn even [x] (or (= x 0) (odd (dec x)))) 
#'clojurec.core/even 
clojurec.core=> (even 10) 
true 
clojurec.core=> (odd 10) 
false 
clojurec.core=> (odd 10000) 
StackOverflowError clojure.lang.Numbers.equal (Numbers.java:214) 

哎呀,這取決於大小(或者說深度)的文件,這可能是一個問題。但是,並非所有丟失,我們可以重新定義,甚至使用trampoline內部:在DEFN

(defn even [n] 
    (letfn [(evenrec [x] (or (= x 0) #(oddrec (dec x)))) 
      (oddrec [x] (and (not (= x 0)) #(evenrec (dec x))))] 
    (trampoline evenrec n)))