metaprogramacion español python ruby lisp metaprogramming

español - Python vs. Ruby para la metaprogramación



ruby vs python español (30)

Actualmente soy principalmente un programador D y estoy buscando agregar otro idioma a mi caja de herramientas, preferiblemente uno que soporte los hackers de metaprogramación que simplemente no se puede 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 llama de idioma, y ​​estoy seguro de que tanto Ruby como Python tienen sus compensaciones, así que voy a enumerar lo que es importante para mí personalmente. Por favor, dígame si Ruby, Python o algún otro idioma sería lo mejor para mí.

Importante:

  1. Buena metaprogramación Posibilidad de crear clases, métodos, funciones, etc. en tiempo de ejecución. Preferiblemente, distinción mínima entre código y datos, estilo Lisp.
  2. Sintaxis agradable, limpia y sensata, y una semántica consistente e intuitiva. Básicamente, un lenguaje moderno, bien pensado y divertido de usar.
  3. Múltiples paradigmas. Ningún paradigma es adecuado para cada proyecto, o incluso cada pequeño subproblema dentro de un proyecto.
  4. Un lenguaje interesante que realmente afecta la forma en que uno piensa en la programación.

Algo importante:

  1. Actuación. Sería bueno si el rendimiento fuera decente, pero cuando el rendimiento es una prioridad real, usaré D en su lugar.
  2. Bien documentada.

No importante:

  1. Tamaño de la comunidad, disponibilidad de la biblioteca, etc. Ninguna de estas son características del idioma en sí, y todas pueden cambiar muy rápidamente.
  2. Disponibilidad de trabajo No soy un programador profesional a tiempo completo. Soy estudiante de posgrado y la programación es tangencialmente relevante para mi investigación.
  3. Cualquier característica que esté diseñada principalmente con proyectos muy grandes trabajada por un millón de monos de código en mente.

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 es así?

distinción mínima entre código y datos, estilo Lisp

Tristemente, la distinción mínima entre código y datos y la sintaxis "extraña" son consecuencias entre sí.

Si quieres una sintaxis fácil de leer, tienes Python. Sin embargo, el código no está representado en ninguna de las estructuras de datos incorporadas comúnmente utilizadas. No funciona, como lo hacen la mayoría de los idiomas, en el elemento n.º 1 de su lista "importante". Eso hace que sea difícil proporcionar ayuda útil.

No puedes tenerlo todo. Recuerde, usted no es el primero en tener este pensamiento. Si existiera algo así como tu lenguaje ideal, todos lo estaríamos usando. Dado que el mundo real no está a la altura de tus ideales, tendrás que volver a priorizar tu lista de deseos. La sección "importante" tiene que reorganizarse para identificar lo que es realmente importante para usted.


uno que admite los hackers de metaprogramación que simplemente no se puede hacer en un lenguaje compilado estáticamente

Me encantaría encontrar un lenguaje que permita algunas de las cosas interesantes que hace Lisp

Lisp se puede compilar.


¿Qué hay de OCaml?

Características de OCaml: un sistema de tipo estático, inferencia de tipo, polimorfismo paramétrico, recursividad de cola, coincidencia de patrones, cierres léxicos de primera clase, funtores (módulos paramétricos), manejo de excepciones y recolección de basura automática generacional incremental.

Creo que satisface lo siguiente:

Importante:

  1. Sintaxis agradable, limpia y sensata, y una semántica consistente e intuitiva. Básicamente, un lenguaje moderno, bien pensado y divertido de usar.
  2. Múltiples paradigmas. Ningún paradigma es adecuado para cada proyecto, o incluso cada pequeño subproblema dentro de un proyecto.
  3. Un lenguaje interesante que realmente afecta la forma en que uno piensa en la programación.

Algo importante:

  1. Actuación. Sería bueno si el rendimiento fuera decente, pero cuando el rendimiento es una prioridad real, usaré D en su lugar.
  2. Bien documentada.

¿Has considerado Smalltalk? Ofrece una sintaxis muy simple, clara y extensible con capacidades de reflexión e introspección y un entorno de desarrollo totalmente 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 se juntan en la lista de correo de Squeak y #squeak en freenode, por lo que puede obtener ayuda en problemas complejos con mucha facilidad.

Otros indicadores de su relevancia actual: se ejecuta en cualquier plataforma que quieras mencionar (incluido el iPhone ); Gilad Bracha está basando su trabajo Newspeak en Squeak; el equipo V8 se mordió las máquinas virtuales Smalltalk ; y Dan Ingalls y Randal Schwartz han regresado recientemente al trabajo de Smalltalk después de años en el desierto.

La mejor de las suertes con su búsqueda, háganos saber lo que decida al final.


¿Has probado Rebol?


@Jason I, respectivamente, no estoy de acuerdo. Existen diferencias que hacen que Ruby sea superior a Python en la metaprogramación, tanto filosófica como pragmática. Para empezar, Ruby obtiene la herencia correcta con Single Herencia y Mixins . Y cuando se trata de metaprogramación, simplemente necesitas entender que se trata de ti mismo . La diferencia canónica aquí es que en Ruby tienes acceso al objeto self en tiempo de ejecución, ¡en Python no tienes acceso!

A diferencia de Python, en Ruby no hay una fase de compilación o tiempo de ejecución por separado. En Ruby, cada línea de código se ejecuta contra un objeto en particular. En Ruby, cada clase hereda de ambos objetos y una metaclase oculta. Esto genera algunas dinámicas interesantes:

class Ninja def rank puts "Orange Clan" end self.name #=> "Ninja" end

El uso de self.name accede al método de nombre de metaclase de las clases Ninja para devolver el nombre de clase de Ninja. ¿La metaprogramación florece tan bella en Python? ¡Sinceramente lo dudo!


Bueno, si no te gusta la sintaxis de lisp, quizás el ensamblador sea el camino a seguir. :-)

Ciertamente tiene una distinción mínima entre código y datos, es multi-paradigma (o quizás no paradigma) y es una experiencia de expansión mental (aunque tediosa) tanto en términos del aprendizaje como de los trucos que puede hacer.


Compare los ejemplos de código que hacen lo mismo (únete a una nueva línea de descripciones no vacías de elementos de una lista myList ) en diferentes idiomas (los idiomas están ordenados en orden alfabético inverso):

Ruby :

myList.collect { |f| f.description }.select { |d| d != "" }.join("/n")

O

myList.map(&:description).reject(&:empty?).join("/n")

Python :

descriptions = (f.description() for f in mylist) "/n".join(filter(len, descriptions))

O

"/n".join(f.description() for f in mylist if f.description())

Perl :

join "/n", grep { $_ } map { $_->description } @myList;

O

join "/n", grep /./, map { $_->description } @myList;

Javascript :

myList.map(function(e) e.description()) .filter(function(e) e).join("/n")

Io :

myList collect(description) select(!="") join("/n")

Aquí hay una guía de Io .


Con respecto a su punto principal (meta-programación): la versión 1.6 de Groovy tiene la programación AST (Árbol de sintaxis abstracta) incorporada como característica estándar e integrada. Ruby tiene RubyParser, pero es un complemento.


Descargo de responsabilidad: solo incursiono en cualquier idioma, pero al menos he escrito pequeños programas de trabajo (no solo guiones rápidos, para los cuales utilizo Perl, bash o GNU make) en ambos.

Ruby puede ser realmente agradable 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 vea un par de bits del código de Ruby on Rails, y un par de bits del código de 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 utilizan personas con diferentes valores. . Nunca he intentado la magia profunda en Python. Ciertamente 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 casi no son conceptualmente puros. Puede definir cierres, asignar métodos a objetos y otras cosas. No estoy seguro de si esto va tan lejos como quieras.]

Personalmente, encuentro a Ruby más divertido, pero en parte es porque es más fácil distraerse pensando en formas geniales de hacer las cosas. De hecho, he usado Python más. A veces no quieres estar fresco, quieres seguir con él así que está listo antes de acostarte ...

Ninguno de ellos es difícil de entender, por lo que podría decidir hacer su siguiente tarea menor en una, y la siguiente en la otra. O tome un libro introductorio sobre cada uno de la biblioteca, lea los dos y vea qué le atrapa.


Estás describiendo a Ruby.

  • Buena metaprogramación Posibilidad de crear clases, métodos, funciones, etc. en tiempo de ejecución. Preferiblemente, distinción mínima entre código y datos, estilo Lisp.

Es muy fácil ampliar y modificar las primitivas existentes en tiempo de ejecución. En ruby, todo es un objeto, cadenas, enteros e incluso funciones.

También puede construir accesos directos para el azúcar sintáctico, por ejemplo con class_eval .

  • Sintaxis agradable, limpia y sensata, y una semántica consistente e intuitiva. Básicamente, un lenguaje moderno, bien pensado y divertido de usar.

Ruby sigue el principio de menos sorpresa , y cuando se compara el código de Ruby con el equivalente en otro idioma, muchas personas lo consideran más "bello".

  • Múltiples paradigmas. Ningún paradigma es adecuado para cada proyecto, o incluso cada pequeño subproblema dentro de un proyecto.

Puedes seguir imperativo, orientado a objetos, funcional y reflexivo.

  • Un lenguaje interesante que realmente afecta la forma en que uno piensa en la programación.

Eso es muy subjetivo, pero desde mi punto de vista la capacidad de usar muchos paradigmas al mismo tiempo permite ideas muy interesantes.

He probado Python y no se ajusta a tus puntos importantes.


Estoy usando Python para muchos proyectos y creo que Python proporciona todas las características que usted solicitó.

importante:

  1. Metaprogramación: Python admite metaclases y generación de clase / método de tiempo de ejecución, etc.
  2. Sintaxis: Bueno, eso es de alguna manera subjetiva. Me gusta la sintaxis de Pythons por su simplicidad, pero algunas personas se quejan de que Python es sensible al espacio en blanco.
  3. Paradigmas: Python admite programación funcional básica, orientada a objetos y de procedimientos.
  4. Creo que Python tiene un estilo orientado muy práctico, fue muy inspirador para mí.

Algo importante:

  1. Rendimiento: Bueno, es un lenguaje de scripting. Pero escribir extensiones C para Python es una práctica común de optimización.
  2. Documentación: No me puedo quejar. No es tan detallado como alguien puede saber de Java, pero es lo suficientemente bueno.

Como usted es estudiante de posgrado, es posible que desee leer este documento afirmando que Python es todo lo que un científico necesita . Desafortunadamente no puedo comparar Python con Ruby, ya que nunca utilicé ese lenguaje.

Saludos, Dennis


He usado Python un poco, pero mucho más Ruby. Sin embargo, yo diría que ambos proporcionan lo que pediste.

Si veo todos sus cuatro puntos, al menos puede verificar: http://www.iolanguage.com/

Y Mozart / Oz puede ser interesante para ti también: http://mozart.github.io/

Saludos Friedrich


Honestamente, en lo que respecta a las instalaciones de metaprogramación, Ruby y Python son mucho más similares de lo que admiten algunos de sus adherentes. Esta revisión de ambos idiomas ofrece una muy buena comparación / revisión:

Por lo tanto, solo elija uno según algunos criterios. Tal vez te gusten los Rails y quieras estudiar ese código. Tal vez SciPy es lo tuyo. Mire el ecosistema de bibliotecas, comunidad, etc., y elija uno. Ciertamente, no perderás ningún nirvana de metaprogramación en función de tu elección.


Io satisface todos sus puntos "importantes". No creo que haya un lenguaje mejor para hacer hackers meta loco.


Lisp satisface todos sus criterios, incluido el rendimiento, y es el único idioma que no tiene sintaxis (extraña). Si lo rechaza en una base tan mal informada / mal dirigida y, en consecuencia, se pierde la experiencia de usar, por ejemplo, Emacs + SLIME + CL, se hará un gran perjuicio.


Mi respuesta sería ninguna de las dos. Conozco ambos idiomas, tomé una clase sobre Ruby y estuve programando en python durante varios años. Lisp es bueno en la metaprogramación debido a 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 idiomas que más me gustan para este tipo de cosas son Rebol, Forth y Factor. Rebol es un lenguaje dialéctico muy fuerte que toma el código de su flujo de entrada, ejecuta una expresión en contra de él y lo transforma usando reglas escritas en el lenguaje. Muy expresivo y extremadamente bueno en dialecting. Factor y Forth están más o menos completamente divorciados de la sintaxis y los programa definiendo y llamando palabras. En general, están escritos principalmente en su propio idioma. No escribe aplicaciones en el sentido tradicional, amplía el idioma al escribir sus propias palabras para definir su aplicación particular. El factor puede ser especialmente bueno ya que tiene muchas características que solo he visto en smalltalk para evaluar y trabajar con el código fuente. Un espacio de trabajo realmente agradable, documentos interactivos, etc.


No estoy seguro de que Python satisfaga todas las cosas que deseas (especialmente el punto acerca de la distinción mínima entre código y datos), pero hay un argumento a favor de Python. Existe un proyecto que facilita la programación de extensiones para python en D, para que pueda tener lo mejor de ambos mundos. http://pyd.dsource.org/celerid.html


No hay mucho para separar a 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 en ambos idiomas, así que lanzaré una tercera opción al ring. ¿Qué tal JavaScript?

JavaScript fue diseñado originalmente para ser Scheme para la web, y está basado en prototipos, lo que es una ventaja sobre Python y Ruby en lo que respecta al multi-paradigma y la metaprogramación. La sintaxis no es tan buena como las otras dos, pero es probablemente el lenguaje más ampliamente implementado que existe, y el rendimiento mejora cada día.


No hay realmente una gran diferencia entre python y ruby, al menos a nivel ideológico. En su mayor parte, solo son sabores diferentes de la misma cosa. Por lo tanto, recomendaría ver cuál coincide más con su estilo de programación.


No mezcle Ruby Programming Language con Ruby Implementations, 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 simple. Si te gusta el ceceo, probablemente prefieras el rubí. O lo que quieras


Para sintaxis de estilo python y macros similares a lisp (macros que son código real) y buena DSL, converge .


Ruby es mi elección después de explorar Python, Smalltalk y Ruby.


Ruby sería mejor que Lisp en términos de ser "convencional" (sea lo que sea que eso signifique realmente , pero una preocupación realista es qué tan fácil sería encontrar respuestas a tus preguntas sobre la programación de Lisp si fueras a eso). En cualquier caso , Encontré a Ruby muy fácil de aprender. En la misma cantidad de tiempo que había pasado aprendiendo Python (u otros idiomas), pronto escribí un código mejor 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 es definitivamente genial y vale la pena investigarlo; como dijiste, el tamaño de la comunidad, etc. puede cambiar bastante rápido. Dicho esto, el tamaño en sí no es tan importante como la calidad de la comunidad. Por ejemplo, el canal #ruby-lang aún está lleno de gente increíblemente inteligente. Lisp parece atraer a algunas personas realmente inteligentes también. No puedo hablar mucho sobre la comunidad de Python ya que no tengo mucha experiencia de primera mano, pero a veces parece ser "demasiado grande". (Recuerdo que la gente es bastante grosera en su canal de IRC, y por lo que he escuchado de amigos que están realmente interesados ​​en Python, esa parece ser la regla y no la excepción).

De todos modos, algunos recursos que pueden serle útiles son:

1) La serie de programación de Ruby Metaprogramming de los programadores pragmáticos ( http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming ) no es gratis, pero los episodios posteriores son bastante intrigantes. (El código es gratuito, si desea descargarlo y ver lo que aprenderá).

2) En Lisp por Paul Graham ( http://www.paulgraham.com/onlisp.html ). Es un poco viejo, pero es un clásico (y se puede descargar de forma gratuita).


Si le gusta el concepto de código-es-datos de estilo lisp, pero no le gusta la sintaxis de Lispy, tal vez Prolog sea ​​una buena opción.

Ya sea que califique como un "lenguaje moderno y divertido de usar", dejaré que otros lo juzguen. ;-)


Sugiero que pruebe ambos idiomas y elija el que más le guste. Tanto Python como Ruby pueden hacer lo que quieras.

Lee también este hilo .


Sus 4 puntos "importantes" conducen exactamente a Ruby, mientras que los 2 puntos "algo importantes" están regidos por Python. Que así sea.


Te recomendaría que fueras con Ruby.

Cuando comencé a aprenderlo, me pareció realmente fácil de aprender.


Ve con JS, solo echa un vistazo a AJS (Sintaxis de JavaScript alternativa) en mi github http://github.com/visionmedia , te dará algunos cierres más limpios, etc.


si amas la rosa, tienes que aprender a vivir con las espinas :)