Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math Clojure中的简单计算器(加法函数输入)_Math_Clojure_Functional Programming_Addition - Fatal编程技术网

Math Clojure中的简单计算器(加法函数输入)

Math Clojure中的简单计算器(加法函数输入),math,clojure,functional-programming,addition,Math,Clojure,Functional Programming,Addition,我想写一个简单的计算器,有加法、减法等 我的问题是获取用户输入。如何将数值字符串转换为向量?还有,编写程序的更好方法是什么 (ns scalc.core) (defn add [numbers] (println (apply + numbers))) (defn numchoose [] (println "What numbers?: ") (let [numbers (read-line)] numbers)) (defn opchoose [] (pri

我想写一个简单的计算器,有加法、减法等

我的问题是获取用户输入。如何将数值字符串转换为向量?还有,编写程序的更好方法是什么

(ns scalc.core)

(defn add
  [numbers]
  (println (apply + numbers)))

(defn numchoose
  []
  (println "What numbers?: ")
  (let [numbers (read-line)] numbers))

(defn opchoose
  []
  (println "What operation would you like to do?: ")
  (let [operation (read-line)]

    (if (= operation "add")
      (do
        (println "You chose to add.")
        (let [numvect (numchoose)]
              (add [numvect]))))))


(defn -main
  [& args]

  (opchoose)
  (numchoose))
这就是错误:

 ~/clj/scalc 1/7 % lein trampoline run -m scalc.core
What operation would you like to do?: 
add
You chose to add.
What numbers?: 
5 7
Exception in thread "main" java.lang.ClassCastException: Cannot cast java.lang.String to java.lang.Number
        at java.lang.Class.cast(Class.java:3005)
        at clojure.core$cast.invoke(core.clj:318)
        at clojure.core$_PLUS_.invoke(core.clj:927)
        at clojure.lang.AFn.applyToHelper(AFn.java:161)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at clojure.core$apply.invoke(core.clj:601)
        at scalc.core$add.invoke(core.clj:5)
        at scalc.core$opchoose.invoke(core.clj:21)
        at scalc.core$_main.doInvoke(core.clj:27)
        at clojure.lang.RestFn.invoke(RestFn.java:397)
        at clojure.lang.Var.invoke(Var.java:411)
        at user$eval15.invoke(NO_SOURCE_FILE:1)
        at clojure.lang.Compiler.eval(Compiler.java:6511)
        at clojure.lang.Compiler.eval(Compiler.java:6501)
        at clojure.lang.Compiler.eval(Compiler.java:6477)
        at clojure.core$eval.invoke(core.clj:2797)
        at clojure.main$eval_opt.invoke(main.clj:297)
        at clojure.main$initialize.invoke(main.clj:316)
        at clojure.main$null_opt.invoke(main.clj:349)
        at clojure.main$main.doInvoke(main.clj:427)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at clojure.lang.Var.invoke(Var.java:419)
        at clojure.lang.AFn.applyToHelper(AFn.java:163)
        at clojure.lang.Var.applyTo(Var.java:532)
        at clojure.main.main(main.java:37)
编辑:解决的程序现在如下所示:

(ns scalc.core)

(defn add [numbers]
  (reduce + numbers))

(defn numchoose []
  (let [nums (re-seq #"\d+" (read-line))]
    (map #(Integer/parseInt %) nums)))

(defn delegate []
  (println "What operation would you like to do?: ")
  (let [operation (read-line)]

    (when (= operation "add")
      (println "You chose to add.")
      (println "What numbers? ")
      (add (numchoose)))))

(defn -main
  [& args]

  (delegate))

要获取数字,您可以使用:

不过,您仍然只有字符串而不是数字。您可以使用read string来获取数字(read string很方便,但并非在所有情况下都是安全的。在这里,我们确保这些字符串中确实只有数字,这样就可以了)

您可以使用:
(reduce+numbers)
,而不是
(apply+numbers)
,而且您的add函数实际上不应该打印任何内容(您应该尽可能将功能性函数与副作用性函数分开)

这个
(让[数字(读线)]数字)
等于
(读线)
。不要把事情过分复杂化

而不是

(if (= operation "add")
      (do ... ))
你可以写

(when (= operation "add")
     ...)

只是一个宏,在ifs中不需要else的情况下非常有用(它在do中包装条件后的所有内容,在条件计算为false时计算为nil)。

感谢您提供的详细答案!我修复了程序,还使用(Integer/parseInt)将分隔的数字字符串转换为整数。()。
(if (= operation "add")
      (do ... ))
(when (= operation "add")
     ...)