gpt4 book ai didi

function - 宏参数是函数吗?

转载 作者:行者123 更新时间:2023-12-02 19:30:29 27 4
gpt4 key购买 nike

我试图确定宏中的给定参数是否是一个函数,例如

(defmacro call-special? [a b]
(if (ifn? a)
`(~a ~b)
`(-> ~b ~a)))

这样以下两个调用都会生成“Hello World”

(call-special #(println % " World") "Hello")
(call-special (println " World") "Hello")

但是,我不知道如何将“a”转换为 ifn?可以理解。如有任何帮助,我们将不胜感激。

最佳答案

您可能想问自己为什么要以这种方式定义call-special?。它似乎不是特别有用,甚至不能节省您任何输入 - 您真的需要宏来执行此操作吗?

话虽如此,如果您决心让它工作,那么一个选择是查看 a 内部,看看它是否是一个函数定义:

(defmacro call-special? [a b]
(if (#{'fn 'fn*} (first a))
`(~a ~b)
`(-> ~b ~a)))

这是有效的,因为#()函数文字被扩展为如下形式:

(macroexpand `#(println % " World"))
=> (fn* [p1__2609__2610__auto__]
(clojure.core/println p1__2609__2610__auto__ " World"))

我仍然认为这个解决方案相当丑陋,并且一旦你开始做更复杂的事情(例如使用嵌套宏来生成函数)就容易失败

关于function - 宏参数是函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12774881/

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