gpt4 book ai didi

macros - Clojure:是否可以创建一个宏来在单个 condp 子句中创建两个元素?

转载 作者:行者123 更新时间:2023-12-02 08:14:39 33 4
gpt4 key购买 nike

condp 子句如下所示:

      "plet" (make-adj 2 "ète")
"iet" (make-adj 2 "ète")
"nin" (make-adj 1 "gne")

我想将条件添加到 make-adj 函数调用中,而不是在一行中重复该条件两次。我想要一个可以改变这个的宏:

(test-make-adj "plet" 2 "ète")
(test-make-adj "iet" 2 "ète")
(test-make-adj "nin" 1 "gne")

进入此:

      "plet" (make-adj 2 "ète" "plet")
"iet" (make-adj 2 "ète" "iet")
"nin" (make-adj 1 "gne" "nin")

最佳答案

condp 有内置功能来支持这种事情:

(condp #(if (= %1 %2) %1) condition
"plet" :>> #(make-adj 2 "ète" %)
"iet" :>> #(make-adj 2 "ète" %)
"nin" :>> #(make-adj 1 "gne" %))

#(if (= %1 %2) %1) 是一个二进制函数,用于检查其参数是否相等,如果相等则返回第一个参数或nil 否则。

:>> 使得在 condition 上评估谓词的结果,例如"plet" 被传递给 #(make-adj ...) 函数。对于上述谓词,这意味着如果 (= "plet"condition)true,则 "plet" 将传递给 #(make-adj ...)。有关详细信息,请参阅(doc condp)

如果仍然感觉输入太多,您可以创建一个辅助函数:

(defn make-adj* [n s]
(fn [c] (make-adj n s c))

然后像这样使用它:

(condp #(if (= %1 %2) %1) condition
"plet" :>> (make-adj* 2 "ète")
...)

关于macros - Clojure:是否可以创建一个宏来在单个 condp 子句中创建两个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2329021/

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