¿La sintaxis de Clojure es realmente más simple que la de Scala? [cerrado]

8

El argumento que siempre se hace a favor de Clojure es ese.

La sintaxis es más simple y solo hay una forma de expresar código sin reglas complicadas.

Sin embargo, Scala tiene muchos tipos diferentes de sintaxis y construcciones en comparación con Clojure.

Pero desde la última semana, mientras intentaba aprender Clojure, me di cuenta de que la lista de macros incorporadas es interminable, aunque las escribimos con la misma sintaxis de paréntesis, necesitamos aprender cómo funciona cada una.

Entonces, ¿en qué sentido la sintaxis de Clojure es más simple? Para los LISPers podría ser, pero para las personas de diferentes antecedentes, aprender diferentes construcciones en Scala parece más simple.

Entonces, desde un punto de vista neutral, ¿qué sintaxis es más simple y legible?

Amogh Talpallikar
fuente
66
Si observa el estándar Scala, su gramática tiene 7 páginas. tanto como me gusta Scala, no tiene una sintaxis más simple que lisp.
Daniel Gratzer

Respuestas:

18

Entonces, desde un punto de vista neutral, ¿qué sintaxis es más simple y legible?

Esas son dos preguntas muy diferentes.

Más simple significa "compuesto de menos partes". La sintaxis de Clojure tiene menos reglas, por lo que es objetivamente más simple que la de Scala.

La legibilidad , sin embargo, es subjetiva. Principalmente se reduce a la familiaridad . Por ejemplo, creo que ECMAScript, C #, Java, D, Go, C ++ y C son casi incomprensibles, pero para alguien que está acostumbrado a leer ese tipo de sintaxis, son bastante legibles. Esta parte de la pregunta no puede responderse objetivamente o "desde un punto de vista neutral".

Jörg W Mittag
fuente
55
+1: "La legibilidad, sin embargo, es subjetiva. Principalmente se reduce a la familiaridad": Verdadero. He estado jugando con Scheme y Common Lisp últimamente (no soy experto en ninguno de ellos), y no veo por qué su sintaxis se considera difícil de leer: es muy fácil acostumbrarse a ella.
Giorgio el
la sintaxis tiene menos reglas, pero, de nuevo, la curva de aprendizaje sigue siendo la misma, todavía tiene que aprender diferentes macros, de la misma manera que tiene que aprender diferentes construcciones. Incluso si están escritos con un conjunto de símbolos.
Amogh Talpallikar
Sí, pero la pregunta era sobre la sintaxis, no la semántica. Si eso es lo que quieres saber, debes aclarar tu pregunta.
Jörg W Mittag
1
+1: Esta es una buena respuesta a la pregunta del OP. Curiosamente, sin embargo, la idea de que la legibilidad es completamente subjetiva es un mito común. Es lógico sugerir que, dada la experiencia similar de dos idiomas diferentes, un idioma podría ser mucho más legible que el otro, al menos estadísticamente. (Considere, por ejemplo, esos lenguajes esotéricos que son altamente ilegibles incluso si los conoce bastante bien). Desafortunadamente, no conozco ningún estudio sobre este asunto.
Kramii
1
@Kramii: Tengo muchos años de experiencia con C ++ y algunos meses de experiencia con Common Lisp, y encuentro CL mucho más legible que C ++. Esto muestra que Common Lisp es objetivamente mucho más legible que C ++, o que mi forma de razonar está más cerca de cómo funciona CL. O tal vez simplemente no prueba nada en absoluto.
Giorgio
4

Cuando trabajo en Scala, a menudo hay una fase de mi desarrollo (especialmente con las forcomprensiones) en la que tengo que hacer que todos los tipos funcionen correctamente, lo cual es una gran ventaja para los proyectos grandes, pero definitivamente negativo para los pequeños. Esperaba poder olvidar los tipos y centrarme en "hacer el trabajo" en Clojure de la forma que recuerdo vagamente en Perl o Awk, pero hasta ahora no me ha funcionado de esa manera. Mi experiencia es que, en lugar de "hacer que los tipos funcionen" en la fase de código / compilación, obtengo excepciones cuando intento ejecutar mi código. Esto no es una simplificación; El problema no ha desaparecido, se ha trasladado a una parte más peligrosa / costosa del ciclo de desarrollo.

No es una deliciosa simplicidad a la sintaxis Lisp-ish. Una de las grandes fortalezas de Emacs es poder ejecutar código de barrido arbitrario presionando una secuencia de teclas especial en el par de cierre de un bloque de código en cualquier momento en cualquier búfer. La simple naturaleza delimitada por paréntesis de la sintaxis de lisp lo hace elegante de una manera que sería incómoda (¿tener que introducir llaves?) En la mayoría de los otros idiomas. Además, la regularidad (function arg, arg...)y (operator arg, arg...)hace que pensar en funciones y operadores como ciudadanos de primera clase y pensar en funciones anónimas sea muy natural, de una manera que los operadores infijados de otros idiomas como Scala no lo hacen.

Mi experiencia limitada con Scala me impide decir que la sintaxis es más simple o más legible. Claro, hay una sintaxis no simplista en Clojure usando macros, pero mi percepción es que estas macros solo abren una pequeña ventana al pensamiento imperativo en una sintaxis que de otra manera es muy funcional. Imponer una preferencia por la sintaxis funcional o imperativa en el lenguaje puede simplificar las cosas. Tendría que dar un punto a Clojure, Java y Haskell por esto.

Mi preocupación con Scala es la misma preocupación que tuve con C ++ o Perl (aunque en menor grado); La sintaxis del lenguaje se adapta a varios estilos de pensamiento diferentes (Haskell y Java). Esto hace que sea divertido escribir, pero podría ser problemático para la legibilidad. Incluso mientras escribo eso, recuerdo que Clojure admite lenguajes específicos de dominio y me pregunto en qué medida eso socava mi punto.

Tu pregunta es muy interesante. En última instancia, la comparación es compleja. Pero según mi conocimiento actual, tendría que estar de acuerdo en que la sintaxis de Clojure es más simple que Scala, pero tal vez no sea un orden de magnitud completo más simple.

GlenPeterson
fuente
3

Aunque los escribimos con la misma sintaxis de paréntesis

Y esa es básicamente la respuesta a tu pregunta.

Necesitamos aprender cómo funciona cada uno.

Si bien es posible introducir DSL con una sintaxis no tan simple como Common Lisps loopusando macros regulares (dejaré las macros de lectura fuera de esto), se usan principalmente para controlar la evaluación, y aún usarán la sintaxis de expresión s regular. Una característica importante es que incluso las loopmacros más complejas pueden leerse usando el mismo viejo lector sexpr.

Si bien es cierto que tendrá que aprender sobre las diferentes macros y la forma de entrada que toman, digamos Common Lisp condcon sus más anidadas frente a Clojure que condreducen una capa de anidamiento, eso no solo es válido para macros, sino también para funciones regulares Imagine una función habitual tomando una lista citada de una estructura particular como argumento: aún tendrá que ajustarse a la estructura de entrada esperada, ya sea que la función transforme el código, espere algún tipo de lista, plist, un árbol o algo completamente diferente.

Cada vez que encuentre una nueva funcionalidad, habrá algunas API que tendrá que aprender. Eso también se aplicaría a un lenguaje que solo permitiera estrictamente la function(arg1, arg2, …, argN)sintaxis: aún tendría que aprender cuáles son los argumentos esperados, qué efectos secundarios ocurren y cuál es el resultado de cualquier función dada.

Lo que es más fácil acerca de la sintaxis de Lisp en comparación con un lenguaje como Scale, es que todo se representa más o menos igual, y también que el código en sí usa estas representaciones y estructuras de datos (esa sería la homoiconicidad de la que todos hablan). Esta diferencia en la complejidad sintáctica se volvería bastante clara si intentara escribir un analizador Lisp o Clojure y luego un analizador Scala. Tendrá que lidiar con una gramática mucho más complicada: reglas más complejas sobre precedencia, espacios en blanco, ambigüedades, más excepciones, etc.

danlei
fuente
3

De la definición de Wikipedia :

En informática, la sintaxis de un lenguaje de programación es el conjunto de reglas que define las combinaciones de símbolos que se consideran programas correctamente estructurados en ese lenguaje.

Como clojure es un lisp, tienes expresiones s + la lista de macros de lector y eso es todo.

En scala, tiene clases, clases de casos, lambda implícita con _, palabra clave implícita, rasgos, anotaciones genéricas, anotaciones de varianza, etc.

Clojure tiene una sintaxis más simple porque las características se pueden implementar como macros o formas especiales. Esto es imposible con scala, en su tiene que agregar sintaxis para admitir algunas características.

Simon Bergot
fuente
-1

Las macros no son sintaxis.

Discutir el ecosistema o la complejidad básica de la biblioteca es una discusión completamente diferente.

Dave Newton
fuente