Страницы

Поиск по вопросам

вторник, 24 декабря 2019 г.

Условный оператор if на Clojure

#lisp #clojure


Здравствуйте! Ещё в самом начале изучения Clojure. Подскажите пожалуйста.

У меня есть clojure-проект. Я использую шаблонизатор hiccup и стили Bootstrap. Всё
работает. Но вот только не понимаю как работают условные операторы в моём случае.

Вот мой код:

Файл project.clj:

(defproject yupppie "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "ссылка (ссылка словом потому что не позволяет репутация вставлять)"
  :license {:name "Eclipse Public License"
            :url "ссылка"}
  :dependencies [[org.clojure/clojure "1.7.0"]
                 [ring "1.4.0"]
                 [compojure "1.4.0"]
                 [hiccup "1.0.5"]]
  :plugins [[lein-ring "0.9.7"]]
  :ring {:handler yupppie.core/app})


Файл yupppie.core:

(ns yupppie.core
  (:require [compojure.core :refer :all]
            [compojure.route :as route]
            [ring.middleware.params :refer [wrap-params]]
            [clojure.pprint :refer :all]
            [hiccup.core :refer :all]
            [hiccup.page :refer [include-css include-js]]))

(defn home []
  (html
    [:head (include-css "/bootstrap-3.3.6-dist/css/bootstrap.min.css")
     (include-css "/styles.css")
     (include-css "https://fonts.googleapis.com/icon?family=Material+Icons")
     (include-js "/bootstrap-3.3.6-dist/js/bootstrap.min.js")]

[:body
      [:div {:class "col-lg-6"}
      [:div {:class "input-group"}
      [:input {:type "text" :class "form-control" :placeholder "How old are you?"}
      [:span {:class "input-group-btn"}
      [:button {:class "btn btn-default" :type=" button"} "Go, baby!"]]]]]]))

                                            ;
(defroutes app
           (route/resources "/")
           (GET "/" [] (home))
           (POST "/saveform" req
                 (with-out-str (clojure.pprint/pprint (:params req)))))
(def apps
  (wrap-params app))


Я стал изучать его недавно, так что пока не очень понимаю.

У меня есть простая форма. И при вводе в поле цифры меньше 18 и нажатии на кнопку,
нужно сделать так чтобы показывалась одна картинка, а при вводе цифры 18 или больше
другая картинка. Вот как мне использовать условный оператор if, чтобы это заработало?
Куда вставлять код и что писать? 
    


Ответы

Ответ 1



Рассчитываю, что вы разберётесь, как прислать значение в форме. Я предположу, что с этим вы разобрались и в параметрах к запросу прилетает нужное значение. Предположу, что строка с присланным числом доступна в параметрах под ключом age и потому может быть забиндена в Compojure, как: (POST "/" [age] ???) Там строка. Нам надо число. Можно не изобретать велосипедов и затянуть функцию as-int из compojure.coercions. Правда, потребуется чуть-чуть изменить описание метода: (POST "/" [age :<< as-int] ???) Альтернативы? В них нет необходимости, реализация as-int предельно проста: (try (Long/parseLong s) (catch NumberFormatException _ nil)) Не видя её исходников ранее, я попытался написать код преобразования сам. Единственным отличием от as-int оказалось использование Integer/parseInt. И оно было ошибочным! Теперь считаем, достаточно ли юзер стар, и сообщаем об этом в шаблон (let [old-enough? (and (-> age nil? not) ; если число не распарсилось, придёт nil (< 18 age))] (функция-шаблончик old-enough?)) В шаблончике... ну, просто берёте и вместо одного из узлов DOM кладёте if. (defn функция-шаблончик [old-enough?] (html [:body (if old-enough? "YEAH" "NOPE")])) Примеры, конечно, совершенно примитивные. Но вы же можете их развить, верно? :)

Комментариев нет:

Отправить комментарий