gpt4 book ai didi

clojure - Clojure 宏中的文本替换功能,如 C 的#define

转载 作者:太空宇宙 更新时间:2023-11-03 18:58:16 24 4
gpt4 key购买 nike

我想写一个宏

(defmacro params [] 'a 'b 'c)

在这样的地方会用到

;; without macro
(fnc a b c)

;; with macro
(fnc params) => (fnc a b c)

如果你看到这可以通过 C 的#define 轻松完成,这只是一个文本替换

但这只会返回一个 'c

最佳答案

我不太确定为什么您想这样做,但在 clojure 中通常会使用以下惯用语:

(defmacro with-params
[params fncall]
`~(concat fncall params))

(defn myfn [x y z]
(spyx :myfn [x y z]))

(let [a 1
b 2
c 3]
(println :with-params)
(with-params [a b c]
(myfn))

结果:

:with-params
:myfn [x y z] => [1 2 3]

但是,如果您想对代码进行硬编码以始终使用参数 a、b 和 c,您可以这样做:

(defmacro with-params-abc
[fncall]
`~(concat fncall '[a b c]))

(println :with-params-abc)
(with-params-abc
(myfn))

结果:

:with-params-abc
:myfn [x y z] => [1 2 3]

关于clojure - Clojure 宏中的文本替换功能,如 C 的#define,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54479461/

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