types - guides - clojure starting
en Clojure, ¿por qué tienen cadenas, palabras clave y símbolos? (2)
Creo que Clojure valora la "practicidad" (si esa es la palabra correcta) algo más que "pureza". Esto se puede ver en el hecho de que Clojure tiene sintaxis para mapas, vectores y conjuntos además de listas, y la está utilizando para definir el idioma. En Esquema, que está mucho más relacionado con la pureza (OMI), solo tiene sintaxis para las listas.
Como Arthur Ulfeldt señala las cadenas, las palabras clave y los símbolos tienen sus casos de uso previstos. Y usarlos según lo previsto hace que sea más fácil leer el código de Clojure. Es similar a lo que ocurre con HTML 5, que agrega un marcado semántico. Cosas como <article>
y <section>
, que puede representar con <div class="article">
y <div class="section">
en HTML 4.
OH, y te equivocas al comparar cadenas solo por identidad. Esto está garantizado para trabajar solo para cadenas internadas. Y no desea internar demasiadas cadenas, ya que se almacenan en el llamado permgen, que tiene un tamaño bastante limitado y nunca se recolecta basura.
Estoy en el proceso de aprender Clojure y no puedo entender algunas decisiones de diseño de idiomas: ¿Por qué un lenguaje con cadenas inmutables como Clojure también necesita tipos de datos de Palabras clave y Símbolos? ¿No podrían las cadenas tener espacios de nombre y metadatos opcionales y todo esto? Para la comparación de cadenas inmutables podría ser igualmente la base de identidad, ¿no?
O, dado que la interoperabilidad con Java es una necesidad para Clojure, al menos debe tener el tipo de Cadena Java y un tipo de datos KeywordSymbol.
Me parece que esta "tricotomía" de cadena / palabra clave / símbolo es especialmente extraña, ya que Clojure parece estar muy centrado en la "pureza" y mantener las cosas simples en otros aspectos.
Cumplen roles muy diferentes dentro del lenguaje:
- Las vars se utilizan para dar nombres a las cosas . Implementan
runnable
y pueden usarse directamente para invocar funciones. No se puede ejecutar una cadena. - Las palabras clave son nombres por sí mismos y se buscan en los mapas. Realmente ayudan a Clojure a mantener su sabor "impulsado por datos". Las cadenas no implementan las interfaces necesarias para buscarse en los mapas.
- Las cuerdas son solo cadenas. Hacen lo que necesitan hacer y no mucho más.
Uno de los principios básicos en el diseño de Clojure fue abrazar su plataforma de host , por lo tanto, las cadenas de Clojure son cadenas de Java y nunca necesita envolver una cadena de Java en alguna función de cadena de convert-to-clojure-string
para ingresar a la Ecosistema de clojure. Esto requería el uso de cadenas Java no modificadas, así como los tipos numéricos. Las palabras clave y los símbolos son construcciones nuevas que se están agregando por Clojure, por lo que solo es necesario hacer que sean accesibles desde el resto del ecosistema de Java. Los símbolos y las palabras clave se hacen accesibles simplemente por ser clases que implementan una interfaz. Al principio, se creía que para que un nuevo lenguaje tuviera éxito en el ecosistema de JVM, necesitaba abarcar completamente Java y minimizar la "falta de coincidencia de impedancia" (perdón por la moda), incluso si eso requería agregar más al lenguaje de lo que lo haría. Se han requerido sin este objetivo.
editar:
Puedes convertir un símbolo en una palabra clave def
a sí mismo
user> a
; Evaluation aborted.
user> :a
:a
user> (def a ''a)
#''user/a
user> a
a
user>
las palabras clave se evalúan a sí mismas