Синтаксический анализ данных строки текстового поля для использования в функциях Clojure
Я делаю простое веб-приложение, чтобы помочь моим друзьям-учителям подсчитать их оценки. У меня есть текущий фрагмент кода, с которым я работаю ниже:
(defn home [& [weights grades error]]
(layout/common
[:h1 "Welcome to Clojure-grade"]
[:hr]
(form-to [:post "/"]
[:p "Enter the weights for your various grades below.
Of course, all of the numbers should add up to 100%, as in the example, below."
(text-field {:placeholder "40 10 50"} "weights" weights)]
[:p "Enter all of the grades for each student.
Make sure that each of the grades is ordered to correspond
to its matching weight above. use brackets to separate students from each other.
The following example shows grades for 4 students. Format your grades according to
the number of students in your class:"
(text-area {:rows 40 :cols 40 :placeholder
"[89 78 63]
[78 91 79]
[54 85 91]
..." } "grades" grades)]
(submit-button "process"))))
(defn process-grades [weights grades]
(->> (float grades)
(map (partial percentify-vector (float weights)))
(mapv #(apply + %))))
(defroutes app
(GET "/" []
{:status 200
:headers {"Content-Type" "text/html"}
:body home})
(POST "/" [weights grades] (process-grades weights grades))
(ANY "*" []
(route/not-found (slurp (io/resource "404.html")))))
(defn wrap-error-page [handler]
(fn [req]
(try (handler req)
(catch Exception e
{:status 500
:headers {"Content-Type" "text/html"}
:body (slurp (io/resource "500.html"))}))))
Я предполагаю, что данные будут связаны с соответствующим weights
а также grades
символы в виде строк. Однако мне нужно вытолкнуть эти кавычки, чтобы использовать плавающие и векторы в моих функциях вычисления. Как я могу это сделать? Я тоже новичок в этом, поэтому, если в моем коде есть какие-либо ошибки или я поступаю неправильно, пожалуйста, дайте мне знать. Кроме того, если вам нужно больше информации о name-space или project.clj, спросите, и я расширю.
1 ответ
Вы можете использовать java interop для преобразования строк в числа с плавающей точкой или целые числа, но идиоматический способ - использовать read-string
(process-grades
(read-string weights)
(read-string grades))