Страницы

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

Показаны сообщения с ярлыком clojure. Показать все сообщения
Показаны сообщения с ярлыком clojure. Показать все сообщения

вторник, 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")])) Примеры, конечно, совершенно примитивные. Но вы же можете их развить, верно? :)

суббота, 22 июня 2019 г.

CIDER ругается на nRepl после обновления пакетов в Emacs

; CIDER 0.11.0snapshot (package: 20160125.741) (Java 1.8.0_72, Clojure 1.7.0, nREPL 0.2.10) WARNING: CIDER requires nREPL 0.2.12 (or newer) to work properly WARNING: The following required nREPL ops are not supported: apropos classpath complete eldoc format-code format-edn info inspect-pop inspect-push inspect-refresh macroexpand ns-list ns-vars ns-path refresh resource stacktrace toggle-trace-var toggle-trace-ns undef Please, install (or update) cider-nrepl 0.11.0-SNAPSHOT and restart CIDER WARNING: CIDER's version (0.11.0-snapshot) does not match cider-nrepl's version (not installed). Things will break! user>

Как устранить конфликты в пакетах?
project.clj:
(defproject lesson-rpg1 "0.1.0-SNAPSHOT" :description "FIXME: write description" :url "http://example.com/FIXME" :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} :dependencies [[org.clojure/clojure "1.7.0"]] :main ^:skip-aot lesson-rpg1.core :target-path "target/%s" :profiles {:uberjar {:aot :all}})
lein deps :tree
D:\CODE\Clojure\lesson-rpg1>lein deps :tree [clojure-complete "0.2.3" :exclusions [[org.clojure/clojure]]] [org.clojure/clojure "1.7.0"] [org.clojure/tools.nrepl "0.2.10" :exclusions [[org.clojure/clojure]]] D:\CODE\Clojure\lesson-rpg1>
lein version:
D:\CODE\Clojure\lesson-rpg1>lein version Leiningen 2.5.2 on Java 1.8.0_72 Java HotSpot(TM) 64-Bit Server VM D:\CODE\Clojure\lesson-rpg1>


Ответ

Сложилась неприятная ситуация
...в самом Leiningen будет указана старая версия tools.nrepl до следующего релиза. Поэтому нужно указать версию явно в проекте или профиле (см. далее):
[org.clojure/tools.nrepl "0.2.12" :exclusions [[org.clojure/clojure]]]
...и так, чтобы при этом не приклеивалась зависимость от конкретной версии Clojure. И ещё, похоже, потребуется это:
[cider/cider-nrepl "0.11.0-SNAPSHOT"]

Что происходит
Если проект не указывает версию org.clojure/tools.nrepl явно, то используется та, что распространяется с Leiningen, в вашем случае это оказалась старая версия 0.2.10
Можно действовать любым из следующих способов:
указать её явно прямо в проекте в списке зависимостей добавить в профиль по умолчанию (~/.lein/profiles.clj)
это зависимость, поэтому подлежит записи под ключом :dependencies обновить Leiningen и получить новую встроенную версию tools.nrepl
на данный момент неактуально, ждём очередного релиза Leiningen.
Поскольку речь о совместимости проекта с вашей собственной средой разработки (а код самого проекта не зависит от этого), первый вариант плохо подходит, а второй скорее "заплатка".