clojure – 从嵌套映射(和向量)创建HTML表

clojure – 从嵌套映射(和向量)创建HTML表,第1张

概述我正在尝试创建一个我之前使用 python编写的表(工作计划表),我认为这对我来说是一个很好的Clojure语言介绍. 我在Clojure(或者那个问题上的lisp)方面经验很少,而且我已经完成了谷歌和一些试验和错误,但似乎无法理解这种编码风格. 这是我的示例数据(将来会来自sqlite数据库): (def smpl2 (ref {"Salaried" [{"John 我正在尝试创建一个我之前使用 python编写的表(工作计划表),我认为这对我来说是一个很好的Clojure语言介绍.

我在Clojure(或者那个问题上的lisp)方面经验很少,而且我已经完成了谷歌和一些试验和错误,但似乎无法理解这种编码风格.

这是我的示例数据(将来会来自sqlite数据库):

(def smpl2 (ref {"SalarIEd"              [{"John Doe" ["12:00-20:00" nil nil nil "11:00-19:00"]}              {"Mary Jane" [nil "12:00-20:00" nil nil nil "11:00-19:00"]}]             "Shift Manager"             [{"Peter Simpson" ["12:00-20:00" nil nil nil "11:00-19:00"]}              {"Joe Jones" [nil "12:00-20:00" nil nil nil "11:00-19:00"]}]             "Other"             [{"Super Man" ["07:00-16:00" "07:00-16:00" "07:00-16:00"                        "07:00-16:00" "07:00-16:00"]}]}))

我试图通过这个最初使用然后转移到doseq和最终domap(这似乎更成功)并将内容转储到HTML表(我的原始python程序从sqlite数据库输出到使用COM的excel电子表格).

这是我的尝试(create-table fn):

(defn HTML-doc [Title & body]   (HTML (DOCTYPE "xhtml/Transitional")     [:HTML [:head [:Title Title]] [:body body]])) (defn create-table []  [:h1 "Schedule"]  [:hr]  [:table (:style "border: 0; wIDth: 90%")   [:th "name"][:th "Mon"][:th "Tue"][:th "Wed"]   [:th "Thur"][:th "Fri"][:th "Sat"][:th "Sun"]   [:tr    (domap [ct @smpl2]        [:tr [:td (key ct)]        (domap [cl (val ct)]           (domap [c cl]              [:tr [:td (key c)]]))])    ]])(defroutes tstr  (GET "/" ((HTML-doc "Sample" create-table)))  (ANY "*" 404))

这会输出带有部分(工资,经理等)和章节中的名称的表格,我只是觉得我通过嵌套太多次来滥用domap,因为我可能需要添加更多的domaps才能获得在适当的列和代码中的转换时间对它来说是一种“肮脏”的感觉.

如果我没有提供足够的信息,我会提前道歉,我通常不会在编码方面寻求帮助,这也是我的第一个问题:).

如果你知道任何更好的方法来做到这一点,甚至提示或技巧,我应该知道作为一个新手,他们肯定是受欢迎的.

谢谢.

解决方法 没有办法避免某种嵌套循环.但是你根本不需要domap,Compojure足够聪明(有时)为你扩展seq.列表和地图就足够了.例如Michałmarczyk的回答,或者:
(defn map-tag [tag xs]  (map (fn [x] [tag x]) xs))(defn create-table []  (List   [:h1 "Schedule"]   [:hr]   [:table {:style "border: 0; wIDth: 90%"}    [:tr (map-tag :th ["name" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat" "Sun"])]    [:tr (for [[category people] smpl2]           (List* [:tr [:td category]]                  (for [person people                        [name hours] person]                    [:tr [:td name] (map-tag :td hours)])))]]))

“在seq上映射并将所有内容包装在同一个标​​签中”模式很常见,我有时会喜欢使用辅助函数.

Compojure为您扩展了一个seq级别.因此,您可以将一些内容放入列表中,以便在HTML输出中按顺序显示标记,这样我就可以显示h1和hr.在你的代码中,你只是扔掉了h1和hr.

但请注意,它只扩展了一个级别.当你有一个列表列表或一个seq列表时,外部seq将会扩展,但内部seq将不会.

user> (println (HTML (List [:div "foo"] (for [x [1 2 3]] [:div x]))))<div>foo</div>clojure.lang.LazySeq@ea73bbfd

看看内部seq如何制作Compojure barf.查看compojure.HTML.gen / expand-seqs以查看其工作原理,或者如果您愿意,可以更改/修复它.

当您在列表中嵌套for或for时,这可能是一个问题,因为返回一个惰性seq.但你必须避免使用seq-in-a-seq.我使用上面的列表*. List和HTML的组合也可以使用.还有很多其他方法.

user> (println (HTML (List* [:div "foo"] (for [x [1 2 3]] [:div x]))))<div>foo</div><div>1</div><div>2</div><div>3</div>user> (println (HTML (List [:div "foo"] (HTML (for [x [1 2 3]] [:div x])))))<div>foo</div><div>1</div><div>2</div><div>3</div>
总结

以上是内存溢出为你收集整理的clojure – 从嵌套映射(和向量)创建HTML表全部内容,希望文章能够帮你解决clojure – 从嵌套映射(和向量)创建HTML表所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1134228.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存