Me gustaría aprender un lenguaje que se interpreta, se escribe de forma dinámica y es funcional. ¿Recomendarías Ruby, Python, Clojure o algo más?

Por mucho que odie responder de esta manera, creo que su pregunta se basa en algunas suposiciones bastante problemáticas.

Para empezar, Python definitivamente no es un lenguaje de programación funcional. Python tiene una separación de sintaxis de expresión y expresión, lo que hace que sea muy difícil escribir código funcional sin estado de mutación. Lambda en Python es extremadamente limitado permitiendo solo una expresión. El alcance en Python no es compatible con el alcance anidado, ya que permite y dificulta las cosas cuando se anidan funciones que de otro modo harían referencia al alcance fuera de la función. Python no optimiza las llamadas de cola, lo que significa que Python es muy ineficiente para la recursión. El propio creador de Python se cita diciendo que Python no es un lenguaje funcional.

En segundo lugar, Ruby tampoco es una muy buena opción para aprender programación funcional. Tiene algún soporte opcional para las llamadas de cola, pero no es el predeterminado, así que ten cuidado. El alcance de Ruby también se limita al alcance de la función, lo que dificulta los bloques anidados. Además, Ruby y Python no tienen un tipo nativo decente que sea inmutable, por lo que probablemente tengas que crearlos todos tú mismo.

Ruby y Python realmente solo tienen algunas características de lenguaje token que se usan mucho en la programación de funciones como lambdas y funciones de filtro / mapa / plegado. Pero no son lenguajes de programación funcionales.

A continuación, la idea de que un lenguaje es interpretado o compilado es realmente una falsa dicotomía. Es bastante sin sentido. Entiendo que varios idiomas solo tienen intérpretes de uso común y algunos idiomas solo se compilan en el uso común. Y sí, coloquialmente estoy de acuerdo, eso los hace lenguajes “interpretados” o “compilados”. Pero ahí termina. No tiene nada que ver con la sintaxis o la semántica. Por lo tanto, no hay propiedades de idioma que se garantice que existan o que no se basen en la interpretación o compilación. De hecho, podría tomar su lenguaje interpretado y escribir un compilador para él. ¿Ahora que? Nada sobre el lenguaje ha cambiado. Así que asegúrese de saber que esta es una falsa dicotomía al leer sobre las diferencias o al elegir qué idioma usar. También entiendo que la única implementación de Clojure que conozco compila el código de byte. El código de bytes es interpretado por la máquina virtual. Entonces, ¿se compila o interpreta Clojure? La respuesta es la misma que la respuesta para Java.

Dicho esto, recomendaría Clojure a lo grande. Es mucho más moderno, tiene una implementación mucho más rápida, tiene acceso a todas las bibliotecas de JVM, no rompieron el alcance como Ruby o Python, en realidad es un lenguaje funcional que no solo es un gran positivo sino que es lo que usted es específicamente buscando aprender También tiene la sintaxis Lisp que le da un sistema macro increíblemente poderoso.

Elija uno de Python o Ruby. (Clojure es demasiado oscuro para ser generalmente útil a menos que tenga en mente algo específico que se beneficie de un modelo funcional).

Pythonistas y Rubyists le dirán que su idioma preferido es el mejor para saber. Personalmente, escogería Python por las siguientes razones:

  • Se usa para una gama más amplia de cosas (desarrollo de sitios web, desarrollo de back-end, aprendizaje automático, bases de datos y scripts de administrador de sistemas, demostración de algoritmos informáticos), mientras que Ruby se usa más comúnmente para la programación web.
  • Está más estandarizado (hay formas “pythonic” de hacer las cosas), por lo que es una mejor herramienta educativa para aprender conceptos de diseño de software.

Sin embargo, si tienes en mente un proyecto web o quieres usar el fantástico framework Rails, ve con Ruby. También los programadores de Ruby encuentran el lenguaje más expresivo y artístico.

Recomendaría Common Lisp (definitivamente tipado dinámicamente), o Haskell, o Agda (pero están tipificados estáticamente).

Observe que “interpretado” es relevante para implementaciones, no para idiomas (que son especificaciones , a menudo escritas en inglés con cierto formalismo adicional). Por cierto, SBCL es una implementación de Common Lisp donde “todo” se compila dinámicamente en código de máquina, pero se siente “interpretado”.

Te sugiero que pruebes Common Lisp. Alternativamente, ve por la raqueta.

Con Common Lisp aprenderá mucho, incluso lo que realmente significa Orientado a Objetos (no, no tiene nada que ver con Java, C ++ y similares. No son lenguajes OOP, incluso si les gusta creer que lo son).

Common Lisp (especialmente un sistema CL comercial, serio) le dará todo lo que necesita. Raqueta en el otro extremo te dará todos los bloques de construcción posibles, y luego puedes construir tu lenguaje a partir de ellos.

¡O algo mas!

Déjame adivinar: tu problema es que te sientes demasiado “disciplinado”; sientes la atracción del Lado Oscuro y crees que pueden tener galletas …

Bueno, prueba la meta-programación! ¿Cómo es esto para “dinámico”? ¡Los programas que se transforman a medida que se ejecutan, con interpretación, ejecución y compilación, todo mezclado!

Si lo anterior te suena interesante, Raqueta. Ahora, también puedes hacer muchas de esas cosas en Clojure, pero al menos para mí, Clojure se siente un poco más “serio”, y eso es exactamente lo que estamos tratando de evitar, ¿no es así?

Si has trabajado en Java, entonces te recomiendo que pruebes Clojure, te obligará a pensar de manera funcional (Python no lo obliga), y es tan diferente a los lenguajes OO tradicionales que hace. Para un cambio muy refrescante. Puede aprovechar el conocimiento existente de Java ya que se integra bien con otro código Java / JVM. Esto le permite agregar Clojure a su plataforma existente fácilmente. Si estás en una tienda principalmente de Java, diría que prueba Clojure.

Bueno, Python es un gran lenguaje interpretado dinámicamente.

Ruby es similar a Python en muchos aspectos y, en general, los desarrolladores tienden a preferir uno u otro, pero como los lenguajes tipificados e interpretados dinámicamente, ambos son opciones adecuadas.

Pero ambos son imperativos . Solo puedo hablar de Python por experiencia, ya que hay algunos elementos funcionales (lambdas, mapas, filtros, …) pero no es lo que yo llamaría un lenguaje declarativo (como Haskell … que es un lenguaje funcional completo).

Por lo tanto, si Declarativo es un requisito difícil, creo que Clojure es la única opción real entre los que enumeró. Personalmente, si realmente aprendiera un lenguaje declarativo probablemente elegiría aprender Scala. Aunque no está tipificado dinámicamente y no se interpreta (al menos no creo que lo esté), se ejecuta en la JVM, lo que creo que complementaría bien mi experiencia Python existente. Haskell es otro lenguaje declarativo , pero está tipificado estáticamente y no creo que sea interpretado (aunque parece que tiene un intérprete como herramienta de desarrollo). Finalmente, está Elm, pero está técnicamente compilado en JavaScript … lo que significa que en tiempo de ejecución se interpreta y se escribe de forma dinámica, pero tiene que compilarse en JavaScript.

Si te preocupa la movilidad profesional, entonces escogería a Ruby y aprendería Rails mientras estás en ello. La burbuja de las redes sociales creó una demanda para los desarrolladores de Ruby on Rails sin suficiente suministro. Se sorprenderá de cuánto gana un desarrollador de Ruby on Rails en comparación con un dev tradicional de JAVA. Sospecho que la burbuja está a punto de estallar; Entonces, te sugiero que te subas al carro pronto.