何时在 clojure(或 lisp)中使用感叹号?
Posted
技术标签:
【中文标题】何时在 clojure(或 lisp)中使用感叹号?【英文标题】:When to use exclamation mark in clojure (or lisp)? 【发布时间】:2014-01-03 13:37:58 【问题描述】:他们说在命名不纯函数时使用感叹号。
但我并不完全理解“不纯”的功能。他们是
函数更改其参数的状态(通过 reset!、alter、java-object-methods...) 函数会出现副作用(例如,打印、吐痰等) 或两者兼而有之?显然,官方 clojure api 并没有在上面的每个案例中都有 bang!s。我想知道我应该什么时候放置它们,需要您的帮助以使我的代码更健全。
【问题讨论】:
【参考方案1】:我想说你不需要把!
放在每个不纯函数上。 Community Clojure Style Guide推荐:
STM事务中不安全的函数/宏的名称 应该以感叹号结尾。
所以,基本上,以!
函数结束,这些函数也会改变原子、元数据、变量、瞬态、代理和 io 的状态。
感谢@noisesmith 提供更新。
【讨论】:
有道理。谢谢!(->> (ns-publics 'clojure.core) (map (comp name first)) (filter #(re-matches #".*!$" %)))
其中许多结果与 STM 交易的安全性无关。
@noisesmith 从某种意义上说,包含这些函数调用的重试 STM 事务可能会产生不同的结果,因为它们会改变不受 STM 控制的状态。
如果是这样的话,我觉得这样说更清楚!是为了状态的突变。不仅是原子,还有元数据、变量、瞬态、代理和 io。
我会说!适用于无法安全重试的所有内容。以上是关于何时在 clojure(或 lisp)中使用感叹号?的主要内容,如果未能解决你的问题,请参考以下文章
从clojure中的普通lisp替换(null x)函数的惯用方法