Clojure GUI калькулятор. «-» всегда возвращает 0, а «/» всегда возвращает 1 - PullRequest
3 голосов
/ 17 марта 2009

Я хорошо знаю, что этот код ужасен. Я просто сделал это, чтобы я мог попробовать разные вещи 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 ]

6 голосов
/ 17 марта 2009

Во второй раз, когда пользователь нажимает кнопку, номер не добавляется в список 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 значение @times-clicked, чтобы оно было после if.

4 голосов
/ 17 марта 2009

Похоже, что add только добавляет число к себе, а функция умножения фактически просто возводит в квадрат первое число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...