У меня есть следующий код Clojure с render Функция, которая отображает html-страницу с помощью enlive-html. В зависимости от выбранного языка используется другой шаблон html.Как уменьшить дублирование в коде Clojure ниже?
Как вы можете видеть, существует много дубликатов кода, и я хотел бы удалить его.
Я думал о написании некоторых макросов, но, если я правильно понимаю, язык (т.е. параметр lang) недоступен во время выполнения макроса, поскольку он предоставляется в запросе и находится во время выполнения, а не во время компиляции ,
Я также попытался изменить запрос, чтобы добавить поддержку i18n в некоторый более поздний момент, но мои навыки Clojure еще не установлены.
Так вопросы:
Как я могу удалить дублирование кода в коде ниже?
Is enlive-html способ пойти или использовать другую библиотеку? Есть ли библиотека, похожая на призыв с поддержкой i18n?
Спасибо!
Смотрите код здесь:
(ns myapp.core
(:require [net.cgrand.enlive-html :as e))
(deftemplate not-found-en "en/404.html"
[{path :path}]
[:#path] (e/content path))
(deftemplate not-found-fr "fr/404.html"
[{path :path}]
[:#path] (e/content path))
(defn getTemplate [page lang]
(case lang
:en (case page
:page/not-found not-found-en)
:fr (case page
:page/not-found not-found-fr)))
(defn render [lang [page params]]
(apply (getTemplate page lang) params))
Что именно вы имеете в виду, re: «Язык недоступен при выполнении макросов»? –
... если ваши макросы генерируют ваш 'deftemplate', вам нужно всего лишь запустить их во время компиляции, чтобы выполнить это выполнение. –
Это относится к http: // codereview.stackexchange.com/, потому что он уже работает. – tar