gpt4 book ai didi

clojure - 将模式和结果作为向量传递给 core.match/match 的宏

转载 作者:行者123 更新时间:2023-12-02 18:35:23 28 4
gpt4 key购买 nike

我正在努力研究如何构建一个宏,让我可以将模式和结果以向量的形式传递给 core.match/match 。我希望能够做到这一点:

(let [x {:a 1}
patterns [[{:a 2}] :high
[{:a 1}] :low]]
(my-match x patterns))

> :low

我已经尝试了以下方法和其他几种不起作用的方法,除非我将模式作为文字传递。

(defmacro my-match [e ems]
`(m/match [~e] ~@ems))

(let [x {:a 1}
patterns [[{:a 2}] :high
[{:a 1}] :low]]
(my-match x patterns))

=> CompilerException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol, compiling:(*cider-repl kontrakt*:106:10)

(let [x {:a 1}]
(my-match x [[{:a 2}] :high
[{:a 1}] :low]))

=> :low

最佳答案

宏在编译时扩展,因此在扩展期间不能依赖运行时信息(参数的值)。根本问题是您不能像应用函数一样应用宏。

In clojure, how to apply a macro to a list?

所以你必须求助于使用 eval:

(defmacro functionize [macro]
`(fn [& args#] (eval (cons '~macro args#))))

(defmacro my-match [e ems]
`(apply (functionize m/match) [~e] ~ems))

或者以不同的方式解决问题(进行运行时模式匹配而不是编译时模式匹配)。

关于clojure - 将模式和结果作为向量传递给 core.match/match 的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37240405/

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