Условные обозначения, стиль и использование для констант Clojure? - PullRequest
38 голосов
/ 27 августа 2010

Каковы лучшие практики для определения констант в Clojure с точки зрения стиля, соглашений, эффективности и т. Д.

Например, это правильно?

(def *PI* 3.14)

Вопросы:

Должны ли константы быть заглавными в Clojure?

Стилистически, должны ли они иметь символ звездочки (*) на одной или обеих сторонах?

Какие соображения по поводу эффективности вычислений я должен знать?

Ответы [ 8 ]

41 голосов
/ 13 января 2011

С http://dev.clojure.org/display/community/Library+Coding+Standards:

Используйте наушники только для вещей, предназначенных для переплета. Не используйте специальные обозначения для констант; все считается постоянным, если не указано иное.

23 голосов
/ 27 августа 2010

Я не думаю, что есть какие-то жесткие и быстрые правила.Я обычно вообще не отношусь к ним.На функциональном языке меньше различий между константой и любым другим значением, потому что вещи чаще чистые.

Звездочки с обеих сторон в Clojure называются "наушниками".Они обычно используются для обозначения «специальной» переменной или переменной, которая будет динамически восстанавливаться с использованием привязки позже.Такие вещи, как out и in , которые иногда возвращаются пользователями к различным потокам, и вот примеры.

Лично я бы назвал это pi.Я не думаю, что когда-либо видел, чтобы люди называли константы особыми именами в Clojure.

РЕДАКТИРОВАТЬ: Мистер Карпер только что отметил, что он сам прописывает константы в своем коде, потому что это соглашение на других языках.Я думаю, это говорит о том, что есть, по крайней мере, некоторые люди, которые делают это.

Я быстро просмотрел стандарты кодирования , но ничего не нашел по этому поводу.Это приводит меня к выводу, что на самом деле вам решать, использовать их или нет.Я не думаю, что кто-нибудь даст вам пощечину за это в долгосрочной перспективе.

13 голосов
/ 27 августа 2010

В области эффективности вычислений вы должны знать, что в Clojure нет такой вещи, как глобальная константа.То, что у вас есть выше, это переменная, и каждый раз, когда вы ссылаетесь на нее, она выполняет поиск.Даже если вы не надеваете на них вкладыши, переменные всегда можно отскочить, поэтому значение всегда может измениться, поэтому их всегда ищут в таблице.Для циклов, критичных к производительности, это, безусловно, неоптимально.

Есть несколько опций, таких как размещение блока let вокруг ваших критических циклов и пропуск значения любых «постоянных» переменных, чтобы они не просматривались.Или создать макрос без аргументов, чтобы постоянное значение компилировалось в код.Или вы можете создать класс Java со статическим членом.

См. Этот пост и последующее обсуждение констант для получения дополнительной информации:

http://groups.google.com/group/clojure/msg/78abddaee41c1227

8 голосов
/ 27 августа 2010

Наушники - это способ обозначить, что данный символ будет иметь собственную привязку thread-local в некоторой точке.Таким образом, нет смысла применять вкладыши к вашей константе Pi.

*clojure-version* является примером константы в Clojure, и она полностью в нижнем регистре.

4 голосов
/ 05 мая 2012

Не используйте специальные обозначения для констант;все считается постоянным, если не указано иное.

См. http://dev.clojure.org/display/community/Library+Coding+Standards

1 голос
/ 23 апреля 2014

В Common Lisp существует соглашение о присвоении имен константам со знаком плюс (+my-constant+), а в Схеме - префиксу со знаком доллара ($my-constant);см эту страницу .Любое такое соглашение противоречит официальным стандартам кодирования Clojure, связанным в других ответах, но, возможно, было бы разумно отличать обычные переменные от тех, которые определены с атрибутом :const.

Я думаю, что есть преимуществопридание нефункциональным переменным любого рода какой-либо отличительной особенностиПредположим, что помимо переменных, определенных для хранения функций, вы обычно используете только локальные имена, определенные параметрами функции, let и т. Д. Если вы все же время от времени определяете нефункциональную переменную, используя def, то когда ее имя появляется в функцииопределение в том же файле, это выглядит на глаз как локальная переменная.Если функция сложная, вы можете потратить несколько секунд на поиск определения имени внутри функции.Добавление отличительного признака, такого как вкладыши, или знаки плюс, или все заглавные буквы, в зависимости от использования переменной, делает очевидным, что определение переменной находится где-то еще.

Кроме того, есть веские причины давать специальные константы, такие как piспециальное имя, поэтому никто не задается вопросом, означает ли pi, скажем, «print-index», или i-тую пиццу, или «сохраненный интерфейс».Конечно, Я думаю, что эти переменные должны иметь более информативные имена, но многие люди используют загадочные, короткие имена переменных, и в итоге я читаю их код.Я не должен задаваться вопросом, означает ли pi пи, поэтому что-то вроде PI может иметь смысл.Никто бы не подумал, что это запуск переменной mill в Clojure.

1 голос
/ 09 сентября 2011

Clojure имеет множество литералов, таких как:

3.14159
:point
{:x 0 
 :y 1}
[1 2 3 4]
#{:a :b :c}

Литералы постоянны. Насколько я знаю, нет никакого способа определить новые литералы. Если вы хотите использовать новую константу, вы можете эффективно сгенерировать литерал в коде во время компиляции:

(defmacro *PI* [] 3.14159265358979323)
(prn (*PI*))
0 голосов
/ 27 августа 2010

Согласно книге «Практическая Clojure», она должна называться *pi*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...