什么是与函数参数具有相同含义的局部变量的约定?

ffr*_*end 2 clojure naming-conventions

什么是与函数参数具有相同含义的局部变量的约定?

如果我需要局部变量作为函数参数的初始状态值(因此具有相同的含义),我应该如何调用它?

作为人为的例子(但是,它证明了Clojure中相当受欢迎的结构):

(defn sum [coll]
  (loop [local-coll coll, result 0]
    (if (empty? local-coll)
       result
       (recur (rest local-coll) (+ (first local-coll) result)))))
Run Code Online (Sandbox Code Playgroud)

这里local-coll初始化为coll最初的值,并且在循环期间它也具有这个含义.local-coll绝对不是一个好名字,但它是什么?

在Haskell中,将quote(')放在变量/函数名的末尾是一种很好的风格,例如var'.在Common Lisp中,有时候我看到以asterisk(*)结尾的名字.Clojure对于复制另一个函数含义但具有不同语义(例如list*)的函数具有相同的符号.但是这种表示法也经常用在文档字符串中,表示可能存在这种类型的几个项目(例如或者),因此在用于本地var名称时可能会混淆.Java interop还提供了类似的东西,即以hyphen()结尾的名称,用于指示生成的类中的私有方法.因此,对于本地(函数的私有)变量使用连字符也是有意义的(尽管对我来说似乎有点奇怪).(methodname [args*] body)*(try expr* catch-clause* finally-clause?)defn--

那么,在命名具有与函数参数相同含义的局部变量时,我应该采用什么方式?

liw*_*iwp 8

我认为当你不再需要原始参数时,可以隐藏参数名称:

(defn sum [coll]
  (loop [coll coll, result 0]
    (if (empty? coll)
       result
       (recur (rest coll) (+ (first coll) result)))))
Run Code Online (Sandbox Code Playgroud)

我见过的其他变化是:

(loop [c colls] ...)
(loop [coll initial-coll] ...)
(loop [foo foo-coll] ...)
(loop [s specs] ...)
Run Code Online (Sandbox Code Playgroud)