gpt4 book ai didi

macros - 让表格: How to access destructured symbols in a macro?

转载 作者:行者123 更新时间:2023-12-04 15:11:27 26 4
gpt4 key购买 nike

我正在尝试编写一个宏,该宏扩展为具有解构的 let 形式。我的问题是我想拥有以 let 形式定义的符号列表,包括通过解构获得的符号列表。

用例

我试图排除这种行为,例如验证:

(let [a (foo bar)
{x :x,
y :y,
{u :u, v: v :as nested-map} :nested} some-map]
(and x y nested-map u v ; testing truthiness
(valid-a? a)
(valid-x? x)
(valid-y? y)
(valid-nested? nested-map)
(valid-u-and-v? u v)
))

建议的解决方案

如果能通过某种 and-let 来实现这一点,那就太好了。我可以这样调用的宏:
(and-let [a (foo bar)
{x :x,
y :y,
{u :u, v: v :as nested-map} :nested} some-map]
(valid-a? a)
(valid-x? x)
(valid-nested? nested-map)
(valid-u-and-v? u v))

我错过了什么

但是我缺少某种访问以 let 形式绑定(bind)的符号列表的方法。如果我有类似 list-bound-symbols 的东西功能,我可以这样做:
(defmacro and-let
"Expands to an AND close that previouly checks that the values declared in bindings are truthy, followed by the tests."
[bindings & tests]
(let [bound-symbols (list-bound-symbols bindings) ;; what I'm missing
]
`(let ~bindings
(and
~@bound-symbols
~@tests)
)))

有没有人知道我该怎么做?

最佳答案

解构由 clojure.core/destructure 处理。功能。它是公开的,因此我们可以自己调用它并提取所有本地人的名称,包括那些命名用于解构的中间结果的名称:

(defmacro and-let [bindings & tests]
(let [destructured (destructure bindings)]
`(let ~destructured
(and ~@(take-nth 2 destructured)
~@tests))))

似乎工作:
(let [foo nil]
(and-let [a 1
[b c] [2 3]]
(nil? foo)))
;= true

关于macros - 让表格: How to access destructured symbols in a macro?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23216696/

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