Actualmente soy principalmente un programador de D y estoy buscando agregar otro lenguaje a mi caja de herramientas, preferiblemente uno que admita los trucos de metaprogramación que simplemente no se pueden hacer en un lenguaje compilado estáticamente como D.
He leído un poco sobre Lisp y me encantaría encontrar un lenguaje que permita algunas de las cosas interesantes que hace Lisp, pero sin la extraña sintaxis, etc. de Lisp. No quiero comenzar una guerra de idiomas, y estoy seguro de que tanto Ruby como Python tienen sus compensaciones, así que enumeraré lo que es importante para mí personalmente. Por favor, dígame si Ruby, Python o algún otro lenguaje sería mejor para mí.
Importante:
- Buena metaprogramación. Capacidad para crear clases, métodos, funciones, etc. en tiempo de ejecución. Preferiblemente, distinción mínima entre código y datos, estilo Lisp.
- Sintaxis agradable, limpia, sana y semántica intuitiva y coherente. Básicamente, un lenguaje moderno bien pensado y divertido de usar.
- Múltiples paradigmas. Ningún paradigma es adecuado para cada proyecto, ni siquiera para cada pequeño subproblema dentro de un proyecto.
- Un lenguaje interesante que realmente afecta la forma en que uno piensa sobre la programación.
Algo importante:
- Actuación. Sería bueno si el rendimiento fuera decente, pero cuando el rendimiento sea una prioridad real, usaré D en su lugar.
- Bien documentada.
No importante:
- Tamaño de la comunidad, disponibilidad de bibliotecas, etc. Ninguna de estas son características del idioma en sí y todas pueden cambiar muy rápidamente.
- Disponibilidad de trabajo. No soy un programador profesional a tiempo completo. Soy un estudiante de posgrado y la programación es tangencialmente relevante para mi investigación.
- Cualquier característica que esté diseñada principalmente con proyectos muy grandes en los que haya trabajado un millón de monos de código en mente.
python
ruby
lisp
metaprogramming
dsimcha
fuente
fuente
Respuestas:
Realmente no hay una gran diferencia entre pitón y rubí, al menos a nivel ideológico. En su mayor parte, son solo diferentes sabores de la misma cosa. Por lo tanto, recomendaría ver cuál se adapta más a su estilo de programación.
fuente
¿No lo haríamos todos?
Lamentablemente, la distinción mínima entre código y datos y sintaxis "extraña" son consecuencias mutuas.
Si desea una sintaxis fácil de leer, tiene Python. Sin embargo, el código no está representado en ninguna de las estructuras de datos integradas de uso común. Falla, como ocurre con la mayoría de los idiomas, en el elemento # 1 de su lista 'importante'. Eso dificulta la prestación de ayuda útil.
No puedes tenerlo todo. Recuerde, usted no es el primero en tener este pensamiento. Si existiera algo como su idioma ideal, todos lo estaríamos usando. Dado que el mundo real no cumple con sus ideales, tendrá que volver a priorizar su lista de deseos. La sección "importante" debe reorganizarse para identificar qué es realmente importante para usted.
fuente
Honestamente, en lo que respecta a las instalaciones de metaprogramación, Ruby y Python son mucho más similares de lo que a algunos de sus seguidores les gusta admitir. Esta revisión de ambos idiomas ofrece una comparación / revisión bastante buena:
Por lo tanto, elija uno según algunos criterios. Quizás te guste Rails y quieras estudiar ese código. Quizás SciPy sea lo tuyo. Mire el ecosistema de bibliotecas, comunidad, etc., y elija una. Ciertamente no perderá un nirvana de metaprogramación basado en su elección de ninguno de los dos.
fuente
Descargo de responsabilidad: solo incursiono en cualquiera de los idiomas, pero al menos he escrito pequeños programas de trabajo (no solo scripts rápidos, para los que uso Perl, bash o GNU make) en ambos.
Ruby puede ser realmente bueno para el punto 3 de "múltiples paradigmas", porque trabaja duro para facilitar la creación de lenguajes específicos de dominio. Por ejemplo, navegue en línea y observe un par de bits de código Ruby on Rails y un par de bits de código Rake. Ambos son Ruby, y puedes ver las similitudes, pero no se parecen a lo que normalmente pensarías como el mismo idioma.
Python me parece un poco más predecible (posiblemente correlacionado con el punto 2 'limpio' y 'sano'), pero realmente no sé si eso se debe al lenguaje en sí o simplemente a que lo usan personas con valores diferentes. . Nunca intenté hacer magia profunda en Python. Sin duda diría que ambos idiomas están bien pensados.
Ambos puntúan bien en 1 y 4. [Editar: en realidad 1 es bastante discutible: hay "eval" en ambos, como es común en los lenguajes interpretados, pero difícilmente son conceptualmente puros. Puede definir cierres, asignar métodos a objetos y todo eso. No estoy seguro de si esto llega tan lejos como desea.]
Personalmente, Ruby me parece más divertido, pero en parte se debe a que es más fácil distraerse pensando en formas interesantes de hacer las cosas. De hecho, he usado más Python. A veces no quieres algo genial, quieres seguir adelante para hacerlo antes de acostarte ...
No es difícil entrar en ninguno de ellos, por lo que podría decidir hacer su próxima tarea menor en uno y la siguiente en el otro. O coja un libro introductorio sobre cada uno de la biblioteca, léalos rápidamente y vea qué le llama la atención.
fuente
¿Ha considerado Smalltalk? Ofrece una sintaxis muy simple, clara y extensible con capacidades de reflectividad e introspección y un entorno de desarrollo completamente integrado que aprovecha esas capacidades. Eche un vistazo a algunos de los trabajos que se están realizando en Squeak Smalltalk, por ejemplo. Muchos investigadores que usan Squeak pasan el rato en la lista de correo de Squeak y #squeak en freenode, por lo que puede obtener ayuda sobre problemas complejos con mucha facilidad.
Otros indicadores de su relevancia actual: se ejecuta en cualquier plataforma que le gustaría nombrar (incluido el iPhone ); Gilad Bracha basa su trabajo de Newspeak en Squeak; el equipo de V8 se puso manos a la obra con las máquinas virtuales Smalltalk ; y Dan Ingalls y Randal Schwartz han regresado recientemente al trabajo de Smalltalk después de años en la naturaleza.
Mucha suerte con su búsqueda; háganos saber lo que decide al final.
fuente
Lisp satisface todos sus criterios, incluido el rendimiento, y es el único lenguaje que no tiene una sintaxis (extraña). Si lo evita sobre una base tan asombrosamente mal informada / equivocada y, en consecuencia, se pierde la experiencia de usar, por ejemplo, Emacs + SLIME + CL, se estará haciendo un flaco favor.
fuente
Sus 4 puntos "importantes" conducen a Ruby exactamente, mientras que los 2 puntos "algo importantes" los rige Python. Que así sea.
fuente
Estás describiendo a Ruby.
Es muy fácil ampliar y modificar primitivas existentes en tiempo de ejecución. En ruby todo es un objeto, cadenas, números enteros, incluso funciones.
También puede construir atajos para azúcar sintáctico, por ejemplo con class_eval .
Ruby sigue el principio de menos sorpresa. , y al comparar el código Ruby con el equivalente en otro idioma, muchas personas lo consideran más "hermoso".
Puede seguir imperativo, orientado a objetos, funcional y reflexivo.
Eso es muy subjetivo, pero desde mi punto de vista, la capacidad de usar muchos paradigmas al mismo tiempo permite ideas muy interesantes.
Probé Python y no se ajusta a tus puntos importantes.
fuente
lambda
/Proc.new
mess ha sido llamado "comportamiento sorprendente" y "altamente contradictorio" aquí en SO. :-) Cualquier lenguaje tan grande y complejo como Ruby seguramente tendrá áreas tan confusas.String
en Ruby con fines de metaprogramación: coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/… . Las subclases no servirían; sin embargo, una función simple de dos argumentos lo haría.Compare ejemplos de código que hacen lo mismo (unir con una nueva línea descripciones no vacías de elementos de una
myList
lista) en diferentes idiomas (los idiomas están organizados en orden alfabético inverso):Rubí :
O
Python :
O
Perl :
O
Javascript :
Io :
Aquí hay una guía de Io .
fuente
Ruby sería mejor que Lisp en términos de ser "mainstream" (sea lo que sea que eso realmente signifique, pero una preocupación realista es lo fácil que sería encontrar respuestas a sus preguntas sobre la programación Lisp si tuviera que ir con eso). Ruby me resultó muy fácil de aprender. En la misma cantidad de tiempo que pasé aprendiendo Python (u otros lenguajes para el caso), pronto estaba escribiendo mejor código de manera mucho más eficiente. que nunca. Sin embargo, esa es solo la opinión de una persona; tómalo con un grano de sal, supongo. Sé mucho más sobre Ruby en este momento que sobre Python o Lisp, pero debes saber que fui una persona de Python durante bastante tiempo antes de cambiar.
Lisp definitivamente es bastante interesante y vale la pena investigarlo; como dijiste, el tamaño de la comunidad, etc. puede cambiar con bastante rapidez. Dicho esto, el tamaño en sí no es tan importante como la calidad de la comunidad. Por ejemplo, el
#ruby-lang
canal todavía está lleno de gente increíblemente inteligente. Lisp también parece atraer a algunas personas realmente inteligentes. No puedo hablar mucho sobre la comunidad de Python porque no tengo mucha experiencia de primera mano, pero a veces parece ser "demasiado grande". (Recuerdo que la gente fue bastante grosera con su canal de IRC, y por lo que he escuchado de amigos que están realmente interesados en Python, esa parece ser la regla más que la excepción).De todas formas, algunos recursos que te pueden resultar útiles son:
1) La serie Pragmatic Programmers Ruby Metaprogramming ( http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming ): no es gratuita, pero los episodios posteriores son bastante intrigantes. (El código es gratuito, si desea descargarlo y ver lo que está aprendiendo).
2) Sobre Lisp de Paul Graham ( http://www.paulgraham.com/onlisp.html ). Es un poco antiguo, pero es un clásico (y se puede descargar gratis).
fuente
Estoy usando Python para muchos proyectos y creo que Python proporciona todas las funciones que solicitó.
importante:
Algo importante:
Como estudiante de posgrado, es posible que desee leer este documento que afirma que Python es todo lo que necesita un científico . Desafortunadamente, no puedo comparar Python con Ruby, ya que nunca usé ese lenguaje.
Saludos, Dennis
fuente
@Jason I, respectivamente, no estoy de acuerdo. Hay diferencias que hacen que Ruby sea superior a Python para la metaprogramación, tanto filosóficas como pragmáticas. Para empezar, Ruby obtiene la herencia correcta con Single Inheritance y Mixins . Y cuando se trata de metaprogramación, simplemente necesita comprender que se trata de uno mismo . La diferencia canónica aquí es que en Ruby tienes acceso al objeto self en tiempo de ejecución, ¡en Python no!
A diferencia de Python, en Ruby no hay una fase separada de compilación o tiempo de ejecución. En Ruby, cada línea de código se ejecuta contra un objeto self particular . En Ruby, cada clase hereda tanto del objeto como de una metaclase oculta. Esto genera algunas dinámicas interesantes:
El uso de self.name accede al método de nombre de la metaclase de las clases Ninja para devolver el nombre de la clase Ninja. ¿Florece la metaprogramación tan hermosa en Python? ¡Lo dudo sinceramente!
fuente
Bueno, si no le gusta la sintaxis lisp, quizás ensamblador sea el camino a seguir. :-)
Ciertamente tiene una distinción mínima entre código y datos, es multi-paradigma (o tal vez no es paradigma) y es una experiencia en expansión (aunque tediosa) tanto en términos de aprendizaje como de trucos que puedes hacer.
fuente
Io satisface todos sus puntos "importantes". No creo que exista un lenguaje mejor para hacer meta hacker loco.
fuente
Lisp se puede compilar.
fuente
¿Probaste Rebol?
fuente
Mi respuesta no sería ninguna. Conozco ambos idiomas, tomé una clase sobre Ruby y he programado en Python durante varios años. Lisp es bueno en la metaprogramación debido al hecho de que su único propósito es transformar listas, su propio código fuente es solo una lista de tokens, por lo que la metaprogramación es natural. Los tres lenguajes que más me gustan para este tipo de cosas son Rebol, Forth y Factor. Rebol es un lenguaje de dialección muy fuerte que toma código de su flujo de entrada, ejecuta una expresión en su contra y lo transforma utilizando reglas escritas en el lenguaje. Muy expresivo y muy bueno para dialectar. Factor y Forth están más o menos completamente divorciados de la sintaxis y usted los programa definiendo y llamando palabras. En general, están escritos en su mayoría en su propio idioma. No escribe aplicaciones en el sentido tradicional, extiende el lenguaje escribiendo sus propias palabras para definir su aplicación particular. Factor puede ser especialmente bueno ya que tiene muchas características que solo he visto en smalltalk para evaluar y trabajar con código fuente. Un espacio de trabajo realmente agradable, documentos interactivos, etc.
fuente
Realmente no hay mucho para separar Python y Ruby. Yo diría que la comunidad de Python es más grande y más madura que la comunidad de Ruby, y eso es realmente importante para mí. Ruby es un lenguaje más flexible, que tiene repercusiones positivas y negativas. Sin embargo, estoy seguro de que habrá mucha gente para entrar en detalles sobre estos dos idiomas, así que lanzaré una tercera opción al ring. ¿Qué hay de JavaScript?
JavaScript fue diseñado originalmente para ser Scheme para la web, y está basado en prototipos, lo cual es una ventaja sobre Python y Ruby en lo que respecta a la metaprogramación y el paradigma múltiple. La sintaxis no es tan agradable como la de los otros dos, pero probablemente sea el lenguaje más implementado que existe, y el rendimiento mejora cada día.
fuente
Si le gusta el concepto de código es datos al estilo lisp, pero no le gusta la sintaxis Lispy, tal vez Prolog sea una buena opción.
Si eso califica como un "lenguaje moderno y divertido de usar", dejaré que otros lo juzguen. ;-)
fuente
Ruby es mi elección después de explorar Python, Smalltalk y Ruby.
fuente
¿Y OCaml?
Características de OCaml: un sistema de tipos estáticos, inferencia de tipos, polimorfismo paramétrico, recursividad de cola, coincidencia de patrones, cierres léxicos de primera clase, functores (módulos paramétricos), manejo de excepciones y recolección de basura automática generacional incremental.
Creo que satisface lo siguiente:
fuente
He usado Python un poco, pero mucho más Ruby. Sin embargo, diría que ambos proporcionan lo que pediste.
Si veo los cuatro puntos, al menos puede consultar: http://www.iolanguage.com/
Y Mozart / Oz también puede ser interesante para ti: http://mozart.github.io/
Saludos Friedrich
fuente
Para la sintaxis de estilo python y macros de tipo lisp (macros que son código real) y buen DSL, consulte converge .
fuente
No estoy seguro de que Python satisfaga todas las cosas que desea (especialmente el punto sobre la distinción mínima entre código y datos), pero hay un argumento a favor de Python. Existe un proyecto que le facilita programar extensiones para python en D, para que pueda tener lo mejor de ambos mundos. http://pyd.dsource.org/celerid.html
fuente
si amas la rosa, tienes que aprender a vivir con las espinas :)
fuente
Te recomendaría que vayas con Ruby.
Cuando comencé a aprenderlo, lo encontré muy fácil de aprender.
fuente
No mezcle el lenguaje de programación Ruby con implementaciones de Ruby, pensando que los hilos POSIX no son posibles en ruby.
Simplemente puede compilar con soporte pthread, y esto ya era posible en el momento en que se creó este hilo , si perdona el juego de palabras.
La respuesta a esta pregunta es sencilla. Si te gusta ceceo, probablemente prefieras ruby. O lo que quieras.
fuente
Le sugiero que pruebe ambos idiomas y elija el que más le guste. Tanto Python como Ruby pueden hacer lo que quieras.
Lea también este hilo .
fuente
Vaya con JS, simplemente consulte AJS (sintaxis alternativa de JavaScript) en mi github http://github.com/visionmedia , le dará algunos cierres de aspecto más limpio, etc.: D
fuente
Con respecto a su punto principal (metaprogramación): la versión 1.6 de Groovy tiene la programación AST (Abstract Syntax Tree) incorporada como una característica estándar e integrada. Ruby tiene RubyParser, pero es un complemento.
fuente