【发布时间】:2017-01-11 22:00:58
【问题描述】:
我有以下带有 render 函数的 Clojure 代码,该函数使用 enlive-html 呈现 html 页面。根据所选语言使用不同的 html 模板。
如您所见,有很多代码重复,我想将其删除。
我正在考虑编写一些宏,但如果我理解正确,该语言(即 lang 参数)在宏执行时不可用,因为它是在请求中提供的,并且是在执行时而不是在编译时提供的。
我还尝试修改 enlive 以便稍后添加 i18n 支持,但我的 Clojure 技能还没有。
所以问题是:
如何去除下面代码中的重复代码?
enlive-html 是要走的路还是我应该使用另一个库? 有没有支持 i18n 的类似 enlive 的库?
谢谢!
在此处查看代码:
(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))
【问题讨论】:
-
你到底是什么意思,回复:“语言在宏执行时不可用”?
-
...如果您的宏正在生成您的
deftemplates,您只需在编译时运行它们即可执行该操作。 -
这属于codereview.stackexchange.com,因为它已经工作了。
-
@CharlesDuffy 用词不好。我在正文中添加了解释
-
@vidi, ...正如我在之前的评论中所说,您不需要知道编译时任何给定请求将使用哪个
lang;您只需要知道哪些langs 可以 可以使用——您可以使用哪些翻译。在编译时生成所有可能的扩展,你就完成了,不需要任何运行时数据。