如何创建一个 returns 打嗝结构的 Clojure 函数?

How to create a Clojure function that returns a Hiccup structure?

假设我想编写一个 Clojure 函数,returns 相当于 <h3>Hello</h3>.

的 Hiccup 结构

怎么办?

我试过了

(defn render-location-details
  [cur-location]
  (let []
    (list :h3 "Hello")
    )
  )

(defn render-location-details
  [cur-location]
  (let []
    [:h3 "Hello"]
    )
  )

但在这两种情况下都收到了错误消息 (:h3 "Location X") is not a valid element name.

更新 1: 我正在从这个调用上面的函数:

(defn generate-location-details-report
  [all-locations]
  (let
    [
     hiccup-title [:h2 "Locations"]
     hiccup-body (into []
                       (map
                         render-location-details
                         all-locations)
                       )
     ]
    (str
      (html hiccup-title)
      hiccup-body
      )
    )
  )

有一个collectionall-locations。对于它的每个元素,我想在 HTML(使用 h3)header(hiccup-body)中创建一个部分,在标题前加上标题(hiccup-title)并将所有这些转换为 HTML.

打嗝 html 函数将采用一系列标签并将它们呈现为字符串。

(let [locations ["one" "two" "three"]
      title-html [[:h2 "Locations"]]
      location-html (map (fn [location] [:h3 location]) locations)]
 (html (concat title-html location-html)))

"<h2>Locations</h2><h3>one</h3><h3>two</h3><h3>three</h3>"

第一个 render-location-details 不起作用,因为列表不是向量,因此 Hiccup 不会将其呈现为标签。

第二个 render-location-details 没问题,可以做你想做的事。空 (let [] 绑定是不必要的。然而,Hiccup 然后通过放置 hiccup-body (into [] 感到困惑 - 它试图将您的位置标签向量理解为标签,因为就 Hiccup 而言 vector = tag.