Как '*var-name*' соглашение о присвоении имен, используемое в clojure?

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

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

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

33
задан Alex Stoddard 31 December 2009 в 20:26
поделиться

3 ответа

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

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

Хотя он специально предназначен для Common Lisp, вам может понравиться эссе Рона Гаррета The Idiot's Guide to Special Variables . Многое из этого все еще можно применить к Clojure.

19
ответ дан 27 November 2019 в 18:34
поделиться

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

Re: делая код читабельным. Джон Д. Хьюм Тю, 30 декабря 2008 08:30:57 -0800

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

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

"Вары, предназначенные для динамической привязки, иногда называют специальным вариантом-
. эльфов. Хороший стиль - называть их с ведущими и отстающими звездочками."

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

и...

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

(def *grid-size* 10)
(def *height* 600)
(def *margin* 50)
(def *x-index* 0)
(def *y-index* 1)
7
ответ дан 27 November 2019 в 18:34
поделиться

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

16
ответ дан 27 November 2019 в 18:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: