gpt4 book ai didi

macros - 在 clojure 中评估宏参数

转载 作者:行者123 更新时间:2023-12-04 20:20:40 28 4
gpt4 key购买 nike

我正在尝试将以下宏从 lisp 领域翻译成 clojure:

(defmacro tag (name atts &body body)
`(progn (print-tag ',name
(list ,@(mapcar (lambda (x)
`(cons ',(car x) ,(cdr x)))
(pairs atts)))
nil)
,@body
(print-tag ',name nil t)))

但我一直坚持需要 1 个更高级别的评估。例如。以下需要评估 t#:
(defmacro tag [tname atts & body]
`(do (print-tag '~tname '[~@(map (fn [[h# t#]] [h# t#]) (pair atts))] nil)
~@body
(print-tag '~tname nil true)))

因为它会产生类似的东西:
(tag mytag [color 'blue size 'big])
<mytag color="(quote blue)" size="(quote big)"><\mytag>

我想要评估属性的地方。如果我在上面使用“(eval t#)”,我会遇到这样的问题:
(defn mytag [col] (tag mytag [colour col]))
java.lang.UnsupportedOperationException: Can't eval locals (NO_SOURCE_FILE:1)

有什么建议?

为什么在 Clojure 中似乎少了一层评估?

支持功能的定义:
;note doesn't handle nils because I'm dumb
(defn pair [init-lst]
(loop [lst init-lst item nil pairs []]
(if (empty? lst)
pairs
(if item
(recur (rest lst) nil (conj pairs [item (first lst)]))
(recur (rest lst) (first lst) pairs)))))

(defn print-tag [name alst closing]
(print "<")
(when closing
(print "\\"))
(print name)
(doall
(map (fn [[h t]]
(printf " %s=\"%s\"" h t))
alst))
(print ">"))

(出于某种原因,我没有以与本书相同的方式执行 pair 函数,这意味着它不能正确处理 nils)

最佳答案

您对 tag 的 Clojure 定义引用属性映射中的所有内容,而普通 lisp 版本仅引用名称。这就是您的问题的直接根源 - 如果您刚刚放弃了 '在您的矢量/ map 前面,然后摆弄 map引用第一个元素,你可能会没事。

然而,虽然移植可能是一个很好的练习,但这段代码并不是用 The Clojure Way 编写的:打印是一个令人讨厌的副作用,它使得很难使用 print-tag 做任何有意义的事情;相反,返回一个字符串会更好。

(defmacro tag [name attrs & body]
`(str "<"
(clojure.string/join " "
['~name
~@(for [[name val] (partition 2 attrs)]
`(str '~name "=\"" ~val "\""))])
">"
~@body
"</" '~name ">"))

user> (tag head [foo (+ 1 2)] "TEST" (tag sample []))
"<head foo=\"3\">TEST<sample></sample></head>"

当然,由于顺序无关紧要,因此使用 map 而不是矢量对属性更好。这也意味着您可以删除 (partition 2...) ,因为 map 的顺序 View 已经成对出现了。

一旦我们走到这一步,就会发现已经有很多方法可以将 XML 表示为 Clojure 数据结构,所以我永远不会在实际应用程序中使用我上面的代码。如果您想真正实现 XML,请查看 Hiccup 中的任何一个, prxml , 或 data.xml .

关于macros - 在 clojure 中评估宏参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6968436/

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