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 loop
usando 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 loop
macros 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 cond
con sus más anidadas frente a Clojure que cond
reducen 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.