Знакомство с Clojure

Sep 14, 2010 20:32

Решил почитать про Clojure, что за зверь такой. Но просто так читать неинтересно, решил параллельно написать что-нибудь простенькое. Например, программку "Угадай число", которую я писал на Бейсике ещё году так в 92-м. "Угадай число" (код под катом) ещё никогда не выглядела так страшно. Если среди моих френдов есть знающие Clojure, буду рад комментариям.



; get-number displays the prompt and tries
; to read the input line from the reader
; until it's approved by check
(defn get-number [reader prompt check]
(loop []
(print (str prompt ": ")) (flush)
(let [line (.readLine reader)
value (check line)]
(if (nil? value)
(recur)
value))))

; returns not-nil number if val is positive
(defn positive-check [val]
(let [value (try (Integer/parseInt val) (catch NumberFormatException e val))]
(if (and (instance? Number value) (pos? value))
value
(do (println "Must be positive number!") nil))))

; returns not-nil number if guess is a string representation of number
(defn guess-check [max-number number guess]
(let [guess-value (try (Integer/parseInt guess) (catch NumberFormatException e guess))]
(if (and (instance? Number guess-value) (pos? guess-value) (<= guess-value max-number))
(cond
(< guess-value number) (println "Too small")
(> guess-value number) (println "Too big")
true guess-value)
(println "Must be a number between 1 and" max-number))))

; main program
(with-open [reader (java.io.BufferedReader. *in*)]
(let [max-number (get-number reader "Enter the maximum number" positive-check )
number (. (java.util.Random.) nextInt max-number)
right-guess (get-number reader (format "Guess the number (1-%d)" max-number) (partial guess-check max-number (inc number)))]
(println "Yes, the number is" right-guess)))

программирование, clojure

Previous post Next post
Up