Data structures RuntimeException不匹配的分隔符:)clojure.lang.Util.RuntimeException(Util.java:221)

Data structures RuntimeException不匹配的分隔符:)clojure.lang.Util.RuntimeException(Util.java:221),data-structures,clojure,Data Structures,Clojure,我在Clojure中实现了Clojure计算器。但是,代码抛出一个异常:“RuntimeException不匹配分隔符:)Clojure.lang.Util.RuntimeException(Util.java:221)”。我不知道是什么原因造成的。下面是代码。谢谢你的帮助 (def prio {'+ 0 ; Define operator priority here '- 0 '* 1 '/ 1 'l -1 'r -1 'dummy

我在Clojure中实现了Clojure计算器。但是,代码抛出一个异常:“RuntimeException不匹配分隔符:)Clojure.lang.Util.RuntimeException(Util.java:221)”。我不知道是什么原因造成的。下面是代码。谢谢你的帮助

(def prio 
   {'+ 0 ; Define operator priority here
    '- 0
    '* 1
    '/ 1
    'l -1
     'r -1
     'dummy -2})

(def operators #{'+ '- '* '/})

(defn pre-process [s]
"Seperate operands with operators and replace ( with l, ) with r"
(re-seq #"\d+|[\+\-\*\/lr]" 
      (clojure.string/replace s #"\(|\)" {"(" "l" ")" "r"})))

(defn calc-once [stk] 
"Take one operator from operator stack and apply it to 
 top two numbers in operand stack"
 (let [opt (:opt stk)
    num (:num stk)
    tmp-num (pop (pop num))
    tmp-opt (pop opt)
    last-two-num [(peek (pop num)) (peek num)]
    last-opt (peek opt)]
  (assoc stk 
       :num (conj tmp-num (apply (eval last-opt) last-two-num))
       :opt tmp-opt)))

(defn process-stk [stk checker fn-ret]
 (loop [stk stk]
  (if (checker stk)
   (recur (calc-once stk))
   (fn-ret stk))))

(defn calc
"A simple calculator"
 [s]
 (process-stk 
 (reduce
  (fn [stk item]
    (let [item (read-string item)
          add-to-num #(assoc %1 :num (conj (:num %1) %2))
          add-to-opt #(assoc %1 :opt (conj (:opt %1) %2))
          item-prio (get prio item)
          last-prio #(get prio (peek (:opt %)))]
      (cond
        (number? item) ; It's number
        (add-to-num stk item)
        (get operators item) ; It's operator
        (process-stk stk #(<= item-prio (last-prio %))
                     #(add-to-opt % item)) 
        (= 'l item) ; (
        (add-to-opt stk item)
        (= 'r item) ; )
        (process-stk stk #(not= (peek (:opt %)) 'l)
                       #(assoc % :opt (pop (:opt %))))
        :else
        (println "Unexpected syntax: " item))))
    (apply (partial list {:num '() :opt '(dummy)}) ;; Basic structure of stack
           s))
#(> (count (:opt %)) 1)
#(peek (:num %))))
(def prio
{'+0;在此处定义运算符优先级
'- 0
'* 1
'/ 1
'l-1
'r-1
'dummy-2})
(def运算符#{'+'-'*'/})
(defn预处理[s]
用运算符分隔操作数,并用r替换(用l,)
(请参见“\d+\\[\+\-\*\/lr]”
(clojure.string/replace s#“\(|\)“{”(“l”)“r”})
(定义计算一次[stk]
“从运算符堆栈中选取一个运算符并将其应用于
“操作数堆栈中的前两个数字”
(let[opt(:opt stk)
num(:num stk)
tmp编号(pop(pop编号))
tmp选项(pop选项)
最后两个数值[(peek(pop num))(peek num)]
最后选择(偷看选择)]
(香港邮政助理)
:num(联合tmp num(应用(eval last opt)last two num))
:opt tmp opt)))
(定义过程stk[stk检查器fn ret]
(循环[stk stk]
(如果(检查者stk)
(重复(计算一次stk))
(fn ret stk)
(定义计算)
“一个简单的计算器”
[s]
(过程stk)
(减少
(fn[stk项目]
(let[项目(读取字符串项目)
添加到num#(assoc%1:num(conj(:num%1)%2))
添加到选项#(关联%1:opt(conj(:opt%1)%2))
项目优先级(获取优先级项目)
最后一次prio#(获得prio(peek(:opt%)))]
(续)
(数字?项目);它是数字
(添加到num stk项目)
(获取运算符项);它是运算符
(过程stk-stk)#(
运行时异常不匹配的分隔符:)


这个错误意味着括号是不平衡的。你在某个地方有一个额外的

很有趣,你的代码与这个代码是多么的相似,不是吗?你真的应该显示更多的堆栈跟踪,它可能会将你指向包含问题的行(似乎是一个额外的“')的某个地方)。这并不能提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-@ThomasBaruchel,我相信这确实回答了问题。错误表明论据不平衡。就这么简单。如何找到不匹配的分隔符?