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

Как используется соглашение об именах `* var-name *`, используемое в clojure?

Как не-lisper, приходящий к clojure, как лучше всего понять соглашение об именах, где vars получает имя типа *var-name*?

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

Я был бы очень признателен за краткое объяснение того, что я должен ожидать, когда автор использовал такие vars в своем коде, в идеале, с примером того, как и почему такой var будет использоваться и изменен в библиотеке clojure.

4b9b3361

Ответ 1

Это соглашение, используемое в других Lisps, таких как Common Lisp, для различения специальных переменных, в отличие от лексических переменных. Специальная или динамическая переменная имеет привязку, хранящуюся в динамической среде, что означает, что ее текущее значение как видимое для любой точки в коде зависит от того, как оно могло быть связано выше в стеке вызовов, а не зависало только от большинства локальную лексическую форму привязки (например, let или defn).

Обратите внимание, что в своей книге Let Over Lambda Дуг Хойте выступает против соглашения астерипов "earmuffs" для обозначения специальных переменных. Он использует необычный стиль макросов, который ссылается на свободные переменные, и он предпочитает не фиксировать или не различать, будут ли эти символы в конечном счете ссылаться на лексические или динамические переменные.

Несмотря на то, что он специально предназначен для Common Lisp, вы можете использовать Ron Garret эссе Руководство для независимых редакторов. Большая часть из них может применяться к Clojure.

Ответ 2

Функциональное программирование - это безопасные предсказуемые функции. Infact, некоторые из нас боятся этого жуткого действия " на расстоянии". Когда люди называют функцию, они получают теплое нечеткое удовлетворение, что функция всегда будет давать им тот же результат, если они вызовут функцию или снова прочитают значение. *un-warm-and-fuzzy* bristly существуют, чтобы предупредить программистов, что эта переменная менее приятная, чем некоторые другие.

Ответ 3

Некоторые ссылки, которые я нашел в новостных группах Clojure:

Re: чтение кода Джон Д. Юм Вт, 30 дек 2008 08:30:57 -0800

В понедельник, 29 декабря 2008 года, 16:10, Chouser написал: Я считаю, что идиомой для глобальных ценностей, как это, является размещение звездочек вокруг имени.

Я думал, что соглашение о звездочке предназначено для переменных, предназначенных для динамическое связывание. Мне потребовалась минута, чтобы выяснить, где я получил идея. "Программирование Clojure" предлагает это (не говоря уже об этом) в глава 6, раздел 3.

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

Очевидно, что книга работает, но это звучит разумный. Специальное соглашение для переменных, значения которых изменяются (или что мой код приветствуется для повторной проверки) кажется мне более полезным, чем для "globals" (хотя я не уверен, что рассмотрю что-то вроде размера сетки для данного приложения глобальным). На основе ants.clj появляется Rich не считает, что для этого требуется специальное соглашение об именах вид значения.

и...

Я считаю, что идиомой для глобальных ценностей, как это, является размещение звездочек вокруг имени. Подчеркивания (и CamelCase) следует использовать только тогда, когда для взаимодействия с Java:

(def *grid-size* 10)
(def *height* 600)
(def *margin* 50)
(def *x-index* 0)
(def *y-index* 1)