何时在clojure(或lisp)中使用感叹号?

Bak*_*n O 21 naming clojure

他们说在命名不纯函数时使用感叹号.

但我并不完全理解"不纯"的功能.是吗

  • 函数改变其参数的状态(通过reset!,alter,java-object-methods,...)
  • 功能发生副作用(例如,打印,吐出......)
  • 或两者?

显然,官方的clojure apis在每个案例上都没有爆炸.我想知道什么时候应该把它们放在一起,需要你的帮助才能使我的代码更加健全.

mis*_*off 25

我会说你不需要加上!每一个不纯的功能.社区Clojure风格指南建议:

在STM事务中不安全的函数/宏的名称应以感叹号结尾.

所以,基本上,结束了!改变原子,元数据,变量,瞬态,代理和io状态的函数.

感谢@noisesmith的更新.

  • 我会说 !适用于所有无法安全重试的事物. (5认同)
  • 如果是这样的话,我认为这样说更清楚!是为了国家的变异.不仅仅是原子,还有元数据,变量,瞬态,代理和io. (4认同)
  • `( - >>(ns-publics'clojure.core)(map(comp name first))(filter#(重新匹配#".*!$"%)))`这些结果中的许多都与之无关STM交易的安全性. (2认同)
  • @noisesmith它们确实意味着包含这些函数调用的重试STM事务可能产生不同的结果,因为它们在不受STM控制的情况下改变状态. (2认同)