【发布时间】:2019-05-09 09:18:35
【问题描述】:
我是 Clojure 的新手。作为练习的一部分,我编写了一个简单的猜谜游戏,用户必须猜出程序选择的 1-100 之间的随机数。我得到了一个基本版本(代码 sn-p 1)。现在我想通过允许用户输入从 1 到 100 的整数来改进这一点。但是,我为避免用户输入字符串而编写的代码不起作用(代码 sn-p 2)但代码不起作用,无论我尝试什么。
代码 sn-p 1(工作)
(ns guessing-game2.core
(:gen-class))
(defn -main []
(let [my-number (inc (rand-int 100))]
(println "I have a number between 1 and 100, guess it: ")
(loop [times 1]
(let [guess (Integer/parseInt (read-line))]
(if (= guess my-number)
(do
(println "You have found it in " times " tries!")
times)
(do
(cond
(< guess my-number) (println "My number is bigger, guess again: ")
(> guess my-number) (println "My number is smaller, guess again: "))
(recur (inc times))))))))
代码 sn-p 2(不工作)
(ns guessing-game.core
(:gen-class))
(defn -main []
(let [my-number (inc (rand-int 100))]
(println "I have a number between 1 and 100, guess it: ")
(loop [times 1]
(let [guess (Integer/parseInt (read-line))]
(if (and (integer? guess)
(< guess 100))
(if (= guess my-number)
(do
(println "You have found it in " times " tries!")
times)
(do
(cond
(< guess my-number) (println "My number is bigger, guess again: ")
(> guess my-number) (println "My number is smaller, guess again: "))))
(print "Please enter a number")
(recur (inc times))
)
))))
【问题讨论】:
-
什么不起作用?这很模糊。
-
虽然运行这个,我在
parseInt下的线上得到Too many arguments to if。您的println和recur调用是if的一部分。我认为您希望他们在if之后出现。 -
您将
print和recur调用传递给if,这是太多的参数。尝试将您的各种ifs 和cond合并为一个cond块。这应该让事情更清楚。接下来,Integer/parseInt将抛出异常。将我们纳入其自己的错误处理函数中,使其与您的新cond语义相匹配。
标签: clojure functional-programming lisp