是否有函数或宏我可以执行以下操作:
(has-side-effects? my-function my-function-args)
Run Code Online (Sandbox Code Playgroud)
:或类似的东西可以返回true或false,或者{:side-effects true/false,:result return_value)
我只需要一种简单的方法来测试哪些功能是无副作用的.
如果它是您的某个功能,请添加一些元数据以标记它是否有副作用.
然后你可以检查它 ((meta f) :side-effects)
如果它是第三方功能,我无法知道(其他更改其代码以使用上述解决方案).
实际上,即便如此,但它并不漂亮.您可以使用自己的函数来包装函数,该函数具有元数据.
此外,请记住,除了没有副作用外,纯函数还有一个附加属性.它的评估仅取决于其参数,而不取决于某些全局共享状态,如外部变量或系统时间.您也可以将其添加到元数据中.然后,您可以通过检查两个元数据条目来检查它是否真的是纯粹的.
但是,请注意:
这简单地不适用于将其他函数作为参数的函数.这是一个例子:呼叫map有副作用吗?
它不在这里: (map inc [1 2 3])
但它确实在这里: (map println [1 2 3])
因为传递的功能可能有也可能没有副作用.
Clojure不是纯粹的功能语言.它不像Haskell那样使用类型系统强制函数的纯度.所以,不,没有(直截了当的)方法来了解Clojure中的函数是否是无副作用的.