Подтвердить что ты не робот

Соглашения, стиль и использование для констант Clojure?

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

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

(def *PI* 3.14)

Вопросы:

Если константы должны быть капитализированы в Clojure?

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

Любые соображения эффективности вычислений, о которых я должен знать?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

EDIT: Мистер Карпер только что указал, что он сам капитализирует константы в своем коде, потому что это конвенция на других языках. Я предполагаю, что это показывает, что есть, по крайней мере, некоторые люди, которые это делают.

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 6

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

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

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

(defmacro *PI* [] 3.14159265358979323)
(prn (*PI*))

Ответ 7

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

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

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

Ответ 8

В соответствии с "Практической книгой Clojure" ее следует называть *pi*