是否有一种规范的方式来命名变量,否则会导致名称冲突?

Ask*_*ker 2 naming clojure

假设我想命名一个变量seq,指的是某种序列。

但是seq已经是 中的一个函数clojure.core,所以如果我尝试命名我的变量seq, 的现有含义seq将被覆盖。

Clojure 中是否有一种规范的方式来命名一个变量,否则该变量会与默认变量发生名称冲突?

(例如,在这种情况下,my-seq可以使用,但我不知道就风格而言这是否是标准的)

Ala*_*son 6

没有命名事物的“标准”方式(请参阅引用相关笑话)。

如果它只是一个事物的函数,我通常只是将它命名为arg。有时,人们使用缩写,例如x表示单个事物和事物xs的序列、列表或向量。

对于小代码片段,缩写为“长”名称的第一个字母通常就足够了。例如,当循环映射时,每个 MapEntry 通常被访问为:

(for [[k v] some-map]  ; destructure key/val into k & v
  ...)
Run Code Online (Sandbox Code Playgroud)

其他时候,您可以在它前面加上一个像aseq或的字母the-seq

我经常使用的另一个技巧是添加一个描述性后缀,如

name-in
name-full
name-first
Run Code Online (Sandbox Code Playgroud)

(是的,有一个 Clojure 函数name)。

请注意,如果您确实命名了它seq,您将创建一个隐藏clojure.core/seq函数的局部变量(它不会被“覆盖”)。如果阴影的范围有限并且所讨论的名称清晰且适当(key并且val通常是这种做法的受害者),我通常只是“让它滑动” 。对于name,我也可能会忽略 的阴影clojure.core/name,因为我很少使用该功能。

请注意,您可以隐藏自己的局部变量。这通常可以方便地将数据强制转换为特定格式:

name-in
name-full
name-first
Run Code Online (Sandbox Code Playgroud)

通过隐藏原始items参数,我们确保数据处于所需的形式,而无需提出两个好的描述性名称。当这种技术并不太适合,我经常回落到后缀把戏,只是他们的名字items-initems或相似。

有时,当需要多个表示时,指示类型的后缀很有价值。例如:

(defn foo
  [items]
  ; assume we need a sorted vector with no duplicates
  (let [items (vec (sort (set (items))))]
    ...))
Run Code Online (Sandbox Code Playgroud)

还有很多其他的可能性。重点是让读者清楚发生了什么,并避免为不知情的人制造陷阱。

如有疑问,请添加更多字母,以便新读者可以清楚地了解正在发生的事情。