何时在 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)函数的惯用方法

Clojure快餐教程-运行在JVM上的Lisp方言

Clojure let vs Common Lisp let

Clojure在Android开发中的应用情况

如何使clojure程序结构更容易识别?

我要学的最后一门编程语言:LISP (Clojure)