naming conventions - ¿Cómo se usa la convención de nombres `* var-name*` en clojure?
naming-conventions lisp (3)
Como un no-receptor que viene a Clojure, ¿cómo debería entender mejor la convención de nombres donde los vars obtienen un nombre como *var-name*
?
Esto parece ser una convención lisp que indica una variable global. Pero en clojure tales vars aparecen en espacios de nombres por lo que puedo decir.
Realmente agradecería una breve explicación de lo que debería esperar cuando un autor haya utilizado tales vars en su código, idealmente con un ejemplo de cómo y por qué tal var se usaría y cambiaría en una biblioteca de clojure.
Algunas referencias que encontré en los grupos de noticias Clojure:
Re: haciendo el código legible John D. Hume Mar, 30 Dec 2008 08:30:57 -0800
El lunes 29 de diciembre de 2008 a las 4:10 PM, Chouser escribió: Creo que el modismo para los valores globales como este es colocar asteriscos alrededor del nombre.
Pensé que la convención de asterisco era para variables destinadas a vinculación dinámica. Me tomó un minuto averiguar de dónde saqué esa idea. "Programming Clojure" lo sugiere (sin decirlo del todo) en el capítulo 6, sección 3.
"Los Vars destinados a vinculación dinámica a veces se denominan variables especiales
ables. Es un buen estilo nombrarlos con asteriscos iniciales y finales ".Obviamente, el libro es un trabajo en progreso, pero parece razonable. Una convención especial para variables cuyos valores cambien (o que mi código sea bienvenido para volver a enlazar) me parece más útil que una para "globales" (aunque no estoy seguro de considerar algo así como el tamaño de cuadrícula para una aplicación dada ) Basado en ants.clj, parece que Rich no cree que deba haber una convención de nomenclatura especial para ese tipo de valor.
y...
Creo que el modismo para los valores globales como este es colocar asteriscos alrededor del nombre. Underscores (y CamelCase) solo se deben usar cuando sea necesario para la interoperabilidad de Java:
(def *grid-size* 10)
(def *height* 600)
(def *margin* 50)
(def *x-index* 0)
(def *y-index* 1)
Es una convención utilizada en otros Lisps, como Common Lisp, para distinguir entre variables especiales , a diferencia de las variables léxicas . Una variable especial o dinámica tiene su enlace almacenado en un entorno dinámico, lo que significa que su valor actual como visible en cualquier punto del código depende de cómo se haya vinculado más arriba en la pila de llamadas, en lugar de depender únicamente de la mayoría de las llamadas. forma de enlace léxico local (como let
o defn
).
Tenga en cuenta que en su libro Let Over Lambda , Doug Hoyte argumenta en contra de la convención asterix "earmuffs" para nombrar variables especiales. Utiliza un estilo macro inusual que hace referencia a variables libres, y prefiere no comprometerse o distinguir si esos símbolos se referirán eventualmente a variables léxicas o dinámicas.
Aunque está dirigido específicamente a Common Lisp, puede disfrutar del ensayo de Ron Garret , La guía del idiota para variables especiales . Gran parte de esto puede aplicarse a Clojure.
La programación funcional se trata de funciones seguras y predecibles . De hecho, algunos de nosotros le tememos a esa escalofriante " acción a distancia ". Cuando las personas llaman a una función obtienen una cálida satisfacción difusa de que la función siempre les dará el mismo resultado si llaman a la función o vuelven a leer el valor. las cosas erizadas *un-warm-and-fuzzy*
existen para advertir a los programadores que esta variable es menos tierno que algunas de las otras.