gpt4 book ai didi

macros - 将可选的文档字符串添加到 def* 宏

转载 作者:行者123 更新时间:2023-12-02 07:30:04 25 4
gpt4 key购买 nike

我想将可选的文档字符串添加到我的 def* 宏中。例如:

(defmacro defhtml
"Macro to avoid backtick unquote[splicing] in html vectors.
TODO: Add optional docstring."
[name args & body]
`(defn ~name ~args (html ~@body)))

;; Working defhtml
(defhtml include-css [href]
[:link {:href href :rel "stylesheet"}])

我愿意:

(defhtml include-css
"My optional docstring here."
[:link {:href href :rel "stylesheet"}])

我认为应该有一些通用的习语。

最佳答案

您需要确定宏的第二个参数是否为文档字符串(您可以测试它是否为字符串)。 Clojure 宏是 Clojure,因此您可以根据需要对传递给宏的表单执行任何逻辑或操作。如果不完全符合您的要求,这应该接近:

(defmacro defhtml [name & args]
(cond
;; doc-string?
(string? (first args))
(let [[doc-string args-list & body] args]
`(defn ~name ~doc-string ~args-list (html ~@body)))

:no-doc-string
(let [[args-list & body] args]
`(defn ~name ~(format "HTML Generator %s" name) ~args-list (html ~@body)))))

这应该会产生您想要的宏扩展:

(defhtml include-css [href]
[:link {:href href :rel "stylesheet"}])

产生:

(defn include-css
"HTML Generator include-css"
[href]
(html [:link {:href href, :rel "stylesheet"}]))

同时:

(defhtml include-css
"Standard css includes fory my site"
[href]
[:link {:href href :rel "stylesheet"}])

产生:

(defn include-css
"Standard css includes fory my site"
[href]
(html [:link {:href href, :rel "stylesheet"}]))

关于macros - 将可选的文档字符串添加到 def* 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22882068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com