Что такое соглашение для локальных переменных, которое имеет то же значение, что и аргумент функции? - PullRequest
2 голосов
/ 23 февраля 2012

Что такое соглашение для локальных переменных, которое имеет то же значение, что и аргумент функции?

Если мне нужна локальная переменная , которая имеет в качестве значения начального состояния аргумент функции (и, следовательно, имеет то же значение ), как я должен ее вызывать ?

В качестве искусственного примера (который, однако, демонстрирует довольно популярную конструкцию в Clojure):

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

Здесь local-coll изначально инициализируется значением coll, и оно также сохраняет это значение во время цикла. local-coll определенно не хорошее название для него, но что это?

В Haskell это хороший стиль, чтобы поместить кавычку (') в конец имени переменной / функции, например var'. В Common Lisp иногда я видел имена, заканчивающиеся звездочкой (*). Clojure имеет ту же запись для функции , которая дублирует другое значение функции, но имеет немного другую семантику (например, список *). Но это обозначение также часто используется в строках документации, чтобы указать, что может быть несколько элементов этого типа (например, (methodname [args*] body)* или (try expr* catch-clause* finally-clause?)) и, таким образом, может привести к путанице при использовании для локальных имен переменных. Java-взаимодействие также предоставляет такие вещи, как defn-, то есть имена, заканчивающиеся дефисом (-), для обозначения частных методов в сгенерированных классах. Поэтому имеет смысл использовать дефис для локальных (приватных для функции) переменных (хотя для меня это немного странно).

Итак, как мне поступить, называя мои локальные переменные в том же значении, что и аргумент функции?

1 Ответ

8 голосов
/ 24 февраля 2012

Я думаю, что это нормально, если скрывать имя аргумента, когда вам больше не нужен исходный аргумент:

(defn sum [coll]
  (loop [coll coll, result 0]
    (if (empty? coll)
       result
       (recur (rest coll) (+ (first coll) result)))))

Другие варианты, которые я видел:

(loop [c colls] ...)
(loop [coll initial-coll] ...)
(loop [foo foo-coll] ...)
(loop [s specs] ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...