Je suis actuellement principalement un programmeur D et je cherche à ajouter un autre langage à ma boîte à outils, de préférence un langage qui prend en charge les hacks de métaprogrammation qui ne peuvent tout simplement pas être effectués dans un langage compilé statiquement comme D.
J'ai lu un peu sur Lisp et j'aimerais trouver un langage qui permette certains des trucs sympas que fait Lisp, mais sans la syntaxe étrange, etc. de Lisp. Je ne veux pas lancer une guerre des flammes du langage, et je suis sûr que Ruby et Python ont leurs compromis, donc je vais énumérer ce qui est important pour moi personnellement. Veuillez me dire si Ruby, Python ou un autre langage serait le meilleur pour moi.
Important:
- Bonne métaprogrammation. Possibilité de créer des classes, des méthodes, des fonctions, etc. au moment de l'exécution. De préférence, distinction minimale entre le code et les données, style Lisp.
- Syntaxe agréable, propre et saine et sémantique cohérente et intuitive. Fondamentalement, un langage moderne bien pensé et amusant à utiliser.
- De multiples paradigmes. Aucun paradigme ne convient à chaque projet, ni même à chaque petit sous-problème d'un projet.
- Un langage intéressant qui affecte en fait la façon dont on pense la programmation.
Assez important:
- Performance. Ce serait bien si les performances étaient correctes, mais lorsque les performances sont une vraie priorité, j'utiliserai D à la place.
- Bien documenté.
Pas important:
- Taille de la communauté, disponibilité des bibliothèques, etc. Aucune de ces caractéristiques n'est caractéristique de la langue elle-même, et toutes peuvent changer très rapidement.
- Disponibilité d'emploi. Je ne suis pas un programmeur professionnel à plein temps. Je suis un étudiant diplômé et la programmation est tangentiellement pertinente à ma recherche.
- Toutes les fonctionnalités qui sont principalement conçues avec de très grands projets travaillés par un million de singes de code à l'esprit.
python
ruby
lisp
metaprogramming
dsimcha
la source
la source
Réponses:
Il n'y a pas vraiment de différence énorme entre python et ruby, du moins au niveau idéologique. Pour la plupart, ce ne sont que des saveurs différentes de la même chose. Ainsi, je recommanderais de voir lequel correspond le plus à votre style de programmation.
la source
N'aurions-nous pas tous.
Malheureusement, la distinction minimale entre le code et les données et la syntaxe «étrange» sont des conséquences l'une de l'autre.
Si vous voulez une syntaxe facile à lire, vous avez Python. Cependant, le code n'est pas représenté dans l' une des structures de données couramment utilisées intégré. Il échoue - comme la plupart des langues - dans l'élément n ° 1 de votre liste «importante». Cela rend difficile de fournir une aide utile.
Vous ne pouvez pas tout avoir. N'oubliez pas que vous n'êtes pas le premier à avoir cette pensée. Si quelque chose comme votre langage idéal existait, nous l'utilisions tous. Étant donné que le monde réel ne correspond pas à vos idéaux, vous devrez redéfinir la priorité de votre liste de souhaits. La section «important» doit être réorganisée pour identifier ce qui est vraiment important pour vous.
la source
Honnêtement, en ce qui concerne les installations de métaprogrammation, Ruby et Python sont beaucoup plus similaires que certains de leurs adhérents aiment l'admettre. Cet examen des deux langues offre une assez bonne comparaison / critique:
Alors, choisissez-en un en fonction de certains critères. Peut-être que vous aimez Rails et souhaitez étudier ce code. Peut-être que SciPy est votre truc. Regardez l'écosystème des bibliothèques, de la communauté, etc., et choisissez-en une. Vous ne perdrez certainement pas un certain nirvana de métaprogrammation en fonction de votre choix.
la source
Clause de non-responsabilité: je ne travaille que dans l'une ou l'autre langue, mais j'ai au moins écrit de petits programmes de travail (pas seulement des scripts rapides, pour lesquels j'utilise Perl, bash ou GNU make) dans les deux.
Ruby peut être très agréable pour le point 3 des «paradigmes multiples», car il travaille dur pour faciliter la création de langages spécifiques à un domaine. Par exemple, naviguez en ligne et regardez quelques morceaux de code Ruby on Rails et quelques morceaux de code Rake. Ils sont tous les deux Ruby, et vous pouvez voir les similitudes, mais ils ne ressemblent pas à ce que vous pensez normalement être le même langage.
Python me semble être un peu plus prévisible (peut-être corrélé au point 2 `` propre '' et `` sain d'esprit ''), mais je ne sais pas vraiment si c'est à cause du langage lui-même ou simplement qu'il est généralement utilisé par des personnes avec des valeurs différentes . Je n'ai jamais tenté de magie profonde en Python. Je dirais certainement que les deux langues sont bien pensées.
Les deux scores bien en 1 et 4. [Edit: en fait 1 est assez discutable - il y a "eval" dans les deux, comme commun dans les langages interprétés, mais ils sont à peine conceptuellement purs. Vous pouvez définir des fermetures, attribuer des méthodes aux objets, etc. Je ne sais pas si cela va aussi loin que vous le souhaitez.]
Personnellement, je trouve Ruby plus amusant, mais c'est en partie parce qu'il est plus facile de se laisser distraire en pensant à des façons sympas de faire les choses. J'ai en fait davantage utilisé Python. Parfois, vous ne voulez pas être cool, vous voulez continuer donc c'est fait avant le coucher ...
Aucun d'entre eux n'est difficile à aborder, vous pouvez donc simplement décider de faire votre prochaine tâche mineure dans l'un, et l'autre dans l'autre. Ou prenez un livre d'introduction sur chacun dans la bibliothèque, lisez-les tous les deux et voyez ce qui vous attire.
la source
Avez-vous envisagé Smalltalk? Il offre une syntaxe très simple, claire et extensible avec des capacités de réflectivité et d'introspection et un environnement de développement entièrement intégré qui tire parti de ces capacités. Jetez un œil à certains des travaux effectués dans Squeak Smalltalk par exemple. De nombreux chercheurs utilisant Squeak se retrouvent sur la liste de diffusion Squeak et #squeak sur freenode, afin que vous puissiez obtenir de l'aide sur des problèmes complexes très facilement.
Autres indicateurs de sa pertinence actuelle: il fonctionne sur n'importe quelle plateforme que vous voudriez nommer (y compris l' iPhone ); Gilad Bracha fonde son travail sur Newspeak sur Squeak; l'équipe V8 a fait ses armes sur les VM Smalltalk ; et Dan Ingalls et Randal Schwartz sont récemment retournés au travail de Smalltalk après des années dans la nature.
Bonne chance dans votre recherche - dites-nous ce que vous décidez à la fin.
la source
Lisp satisfait tous vos critères, y compris les performances, et c'est le seul langage qui n'a pas de syntaxe (étrange). Si vous l'évitez sur une base si étonnamment mal informée / mal avisée et que vous manquez par conséquent l'expérience de l'utilisation par exemple d'Emacs + SLIME + CL, vous vous rendrez un très mauvais service.
la source
Vos 4 points "importants" mènent exactement à Ruby, tandis que les 2 points "assez importants" gouvernés par Python. Ainsi soit-il.
la source
Vous décrivez Ruby.
Il est très facile d'étendre et de modifier les primitives existantes au moment de l'exécution. Dans ruby, tout est un objet, des chaînes, des entiers, même des fonctions.
Vous pouvez également créer des raccourcis pour le sucre syntaxique, par exemple avec class_eval .
Ruby suit le principe de moins de surprise , et en comparant le code Ruby à l'équivalent dans un autre langage, beaucoup de gens le considèrent plus "beau".
Vous pouvez suivre impératif, orienté objet, fonctionnel et réfléchi.
C'est très subjectif, mais de mon point de vue, la possibilité d'utiliser plusieurs paradigmes en même temps permet des idées très intéressantes.
J'ai essayé Python et cela ne correspond pas à vos points importants.
la source
lambda
/Proc.new
mess a été appelé "comportement surprenant" et "hautement contre-intuitif" ici sur SO. :-) Toute langue aussi grande et complexe que Ruby est liée à de telles zones déroutantes.String
dans Ruby à des fins de métaprogrammation: coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/… . Le sous-classement ne ferait pas l'affaire; cependant, une simple fonction à deux arguments le ferait.Comparez les exemples de code qui font la même chose (joindre avec une nouvelle ligne des descriptions non vides des éléments d'une
myList
liste) dans différentes langues (les langues sont organisées dans l'ordre alphabétique inverse):Rubis :
Ou
Python :
Ou
Perl :
Ou
Javascript :
Io :
Voici un guide Io .
la source
Ruby serait meilleur que Lisp en termes de "grand public" (quoi que cela signifie vraiment , mais une préoccupation réaliste est de savoir à quel point il serait facile de trouver des réponses à vos questions sur la programmation Lisp si vous deviez aller avec ça.) Dans tous les cas , J'ai trouvé Ruby très facile à prendre. Dans le même temps que j'avais passé pour la première fois à apprendre Python (ou d'autres langages d'ailleurs), j'ai rapidement écrit un meilleur code beaucoup plus efficacement que jamais auparavant. C'est juste l'opinion d'une personne, cependant; prenez-le avec un grain de sel, je suppose. J'en sais beaucoup plus sur Ruby à ce stade que sur Python ou Lisp, mais sachez que j'étais une personne Python pendant un bon moment avant de changer.
Lisp est vraiment cool et vaut la peine d'être examiné; comme vous l'avez dit, la taille de la communauté, etc. peut changer assez rapidement. Cela étant dit, la taille elle-même n'est pas aussi importante que la qualité de la communauté. Par exemple, la
#ruby-lang
chaîne est toujours remplie de personnes incroyablement intelligentes. Lisp semble aussi attirer des personnes très intelligentes. Je ne peux pas parler beaucoup de la communauté Python car je n'ai pas beaucoup d'expérience de première main, mais elle semble parfois "trop grande". (Je me souviens que les gens étaient assez impolis sur leur canal IRC, et d'après ce que j'ai entendu d'amis qui aiment vraiment Python, cela semble être la règle plutôt que l'exception.)Quoi qu'il en soit, certaines ressources que vous pourriez trouver utiles sont:
1) La série Pragmatic Programmers Ruby Metaprogramming ( http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming ) - pas gratuite, mais les derniers épisodes sont assez intrigants. (Le code est gratuit, si vous souhaitez le télécharger et voir ce que vous allez apprendre.)
2) Sur Lisp par Paul Graham ( http://www.paulgraham.com/onlisp.html ). C'est un peu vieux, mais c'est un classique (et téléchargeable gratuitement).
la source
J'utilise Python pour de nombreux projets et je pense que Python fournit toutes les fonctionnalités que vous avez demandées.
important:
Assez important:
Comme vous êtes étudiant, vous voudrez peut-être lire cet article en affirmant que Python est tout ce dont un scientifique a besoin . Malheureusement, je ne peux pas comparer Python à Ruby, car je n'ai jamais utilisé ce langage.
Cordialement, Dennis
la source
@Jason Je suis respectivement en désaccord. Il existe des différences qui rendent Ruby supérieur à Python pour la métaprogrammation - à la fois philosophique et pragmatique. Pour commencer, Ruby obtient l'héritage juste avec l'héritage unique et les mixins . Et quand il s'agit de métaprogrammation, vous devez simplement comprendre que tout est une question de soi . La différence canonique ici est que dans Ruby, vous avez accès à l' objet self au moment de l'exécution - en Python, ce n'est pas le cas!
Contrairement à Python, dans Ruby, il n'y a pas de phase de compilation ou d'exécution distincte. Dans Ruby, chaque ligne de code est exécutée sur un objet self particulier . Dans Ruby, chaque classe hérite à la fois d'un objet et d'une métaclasse masquée. Cela donne une dynamique intéressante:
L'utilisation de self.name accède à la méthode de nom de métaclasse des classes Ninja pour renvoyer le nom de classe de Ninja. La métaprogrammation fleurit-elle si belle en Python? J'en doute sincèrement!
la source
Eh bien, si vous n'aimez pas la syntaxe lisp, peut-être que l'assembleur est la solution. :-)
Il a certainement une distinction minime entre le code et les données, est multi-paradigme (ou peut-être pas de paradigme) et c'est une expérience en expansion (si fastidieuse) à la fois en termes d'apprentissage et de trucs que vous pouvez faire.
la source
Io satisfait tous vos points "importants". Je ne pense pas qu'il existe un meilleur langage pour faire du méta-piratage fou.
la source
Lisp peut être compilé.
la source
Avez-vous essayé Rebol?
la source
Ma réponse ne serait ni l'un ni l'autre. Je connais les deux langages, j'ai suivi un cours sur Ruby et je programme en python depuis plusieurs années. Lisp est bon pour la métaprogrammation car son seul but est de transformer des listes, son propre code source n'est qu'une liste de jetons donc la métaprogrammation est naturelle. Les trois langues que j'aime le mieux pour ce type de chose sont Rebol, Forth et Factor. Rebol est un langage de dialecte très puissant qui prend le code de son flux d'entrée, exécute une expression contre lui et le transforme en utilisant des règles écrites dans le langage. Très expressif et extrêmement bon en dialecte. Factor et Forth sont plus ou moins complètement séparés de la syntaxe et vous les programmez en définissant et en appelant des mots. Ils sont généralement rédigés dans leur propre langue. Vous n'écrivez pas d'applications au sens traditionnel du terme, vous étendez la langue en écrivant vos propres mots pour définir votre application particulière. Factor peut être particulièrement intéressant car il possède de nombreuses fonctionnalités que je n'ai vues que dans smalltalk pour évaluer et travailler avec le code source. Un très bel espace de travail, des documents interactifs, etc.
la source
Il n'y a pas vraiment grand-chose à séparer Python et Ruby. Je dirais que la communauté Python est plus grande et plus mature que la communauté Ruby, et c'est vraiment important pour moi. Le rubis est un langage plus flexible, qui a des répercussions positives et négatives. Cependant, je suis sûr qu'il y aura beaucoup de gens pour entrer dans les détails sur ces deux langues, donc je vais jeter une troisième option dans le ring. Et JavaScript?
JavaScript a été initialement conçu pour être Scheme pour le Web, et il est basé sur un prototype, ce qui est un avantage par rapport à Python et Ruby en ce qui concerne le multi-paradigme et la métaprogrammation. La syntaxe n'est pas aussi agréable que les deux autres, mais c'est probablement le langage le plus largement déployé et les performances s'améliorent chaque jour.
la source
Si vous aimez le concept code-is-data de style lisp, mais que vous n'aimez pas la syntaxe Lispy, peut-être que Prolog serait un bon choix.
Que cela soit qualifié de "langage moderne et amusant", je laisserai aux autres le soin de juger. ;-)
la source
Ruby est mon choix après avoir exploré Python, Smalltalk et Ruby.
la source
Et OCaml?
Fonctionnalités d'OCaml: un système de type statique, l'inférence de type, le polymorphisme paramétrique, la récursivité de la queue, la correspondance de modèles, les fermetures lexicales de première classe, les foncteurs (modules paramétriques), la gestion des exceptions et le ramasse-miettes automatique générationnel incrémentiel.
Je pense que cela satisfait ce qui suit:
la source
J'utilise un peu Python, mais beaucoup plus Ruby. Cependant, je dirais qu'ils fournissent tous les deux ce que vous avez demandé.
Si je vois tous vos quatre points, vous pouvez au moins vérifier: http://www.iolanguage.com/
Et Mozart / Oz peut être intéressant pour vous aussi: http://mozart.github.io/
Cordialement Friedrich
la source
Pour la syntaxe de style python et les macros de type lisp (macros qui sont du vrai code) et un bon DSL, voir converger .
la source
Je ne suis pas sûr que Python remplisse tout ce que vous désirez (en particulier le point sur la distinction minimale entre le code et les données), mais il y a un argument en faveur de python. Il existe un projet qui vous permet de programmer facilement des extensions pour python en D, afin que vous puissiez avoir le meilleur des deux mondes. http://pyd.dsource.org/celerid.html
la source
si vous aimez la rose, vous devez apprendre à vivre avec les épines :)
la source
Je vous recommanderais d'aller avec Ruby.
Quand j'ai commencé à l'apprendre, je l'ai trouvé très facile à comprendre.
la source
Ne pas mélanger le langage de programmation Ruby avec les implémentations Ruby, en pensant que les threads POSIX ne sont pas possibles dans ruby.
Vous pouvez simplement compiler avec le support pthread, et cela était déjà possible au moment de la création de ce fil , si vous pardonnez le jeu de mots.
La réponse à cette question est simple. Si vous aimez le lisp, vous préférerez probablement le rubis. Ou, tout ce que vous aimez.
la source
Je vous suggère d'essayer les deux langues et de choisir celle qui vous plaît. Python et Ruby peuvent faire ce que vous voulez.
Lisez également ce fil .
la source
Allez avec JS, il suffit de consulter AJS (Alternative JavaScript Syntax) sur mon github http://github.com/visionmedia, cela vous donnera des fermetures plus propres, etc.: D
la source
Concernant votre point principal (méta-programmation): La version 1.6 de Groovy a la programmation AST (Abstract Syntax Tree) intégrée en tant que fonctionnalité standard et intégrée. Ruby a RubyParser, mais c'est un add-on.
la source