Clojure GUI计算器。 “ - ”始终返回0,“/”始终返回1

时间:2009-03-17 00:09:40

标签: java swing clojure

我很清楚这段代码太可怕了。我刚刚做到了所以我可以尝试不同的Swing东西。这是一个有趣的问题。这创建了4个按钮,用于添加,减去,分割和相乘。乘法和加法完美地工作,完全没有问题,但是当用户试图减去它时总是返回0.当用户试图除以它时,总是返回1或1.0,具体取决于输入。我无法弄清楚。这是代码:

(ns rayne.main
  (:gen-class)
  (:import (javax.swing JFrame JTextField JButton JOptionPane)
           (java.awt.event ActionListener)
           (java.awt GridLayout)))

(def numbers (ref []))
(def times-clicked (ref 0))

(defn calc [nseq op]
  (let [n1 (first nseq)
        n2 (last nseq)]
  (cond
    (= op "+") (+ n1 n2)
    (= op "*") (* n1 n2)
    (= op "-") (- n2 n1)
    (= op "/") (/ n1 n2))))

(defn add-op-button [op text button]
  (.addActionListener button
    (proxy [ActionListener] []
      (actionPerformed [e]
      (dosync
       (ref-set times-clicked (inc @times-clicked))
       (if (= @times-clicked 2)
         (do
         (let [result (.toString (calc @numbers op))
               result2 (read-string result)]
           (.setText text result)
           (ref-set numbers [])
           (ref-set times-clicked 0)))
       (do
         (ref-set numbers (conj @numbers (read-string (.getText text))))
         (.setText text ""))))))))

(defn -main []
  (let [frame (JFrame. "Calculator")
        add-button (JButton. "+")
        sub-button (JButton. "-")
        mul-button (JButton. "*")
        div-button (JButton. "/")
        clr-button (JButton. "Clear")
        text-field (JTextField.)]
    (add-op-button "+" text-field add-button)
    (add-op-button "-" text-field sub-button)
    (add-op-button "*" text-field mul-button)
    (add-op-button "/" text-field div-button)
(doto frame
  (.setLayout (GridLayout. 1 5))
  (.add text-field)
  (.add add-button)
  (.add sub-button)
  (.add mul-button)
  (.add div-button)
  (.setSize 500 100)
  (.setVisible true))))

由于复制粘贴和动态格式化,缩进可能搞砸了,但确实如此。我再一次知道代码很糟糕。

2 个答案:

答案 0 :(得分:6)

用户第二次点击按钮时,该号码不会添加到列表numbers中,因此您在一个元素列表上执行calc

由于列表只有一个元素,第一个元素(n1)和最后一个元素(n2)是相同的,

x / x => 1
x - x => 0

我很惊讶你的加法和乘法工作......: - /

我认为您可以通过将@numbers的更新移至if之前来解决此问题:

(ref-set numbers (conj @numbers (read-string (.getText text))))
(if (= @times-clicked 2)

或者将inc的{​​{1}}评论移到@times-clicked之后。

答案 1 :(得分:4)

看起来add只是将数字添加到自身,而乘法函数实际上只是平方第一个数字。