2012-06-04 38 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)))