Atualmente, sou principalmente um programador de D e estou procurando adicionar outra linguagem à minha caixa de ferramentas, de preferência uma que suporte os hacks de metaprogramação que simplesmente não podem ser feitos em uma linguagem compilada estaticamente como D.
Eu li um pouco sobre o Lisp e adoraria encontrar uma linguagem que permita algumas das coisas legais que o Lisp faz, mas sem a sintaxe estranha, etc. do Lisp. Não quero iniciar um conflito de linguagem e tenho certeza de que Ruby e Python têm suas vantagens, então vou listar o que é importante para mim pessoalmente. Diga-me se Ruby, Python ou alguma outra linguagem seria o melhor para mim.
Importante:
- Boa metaprogramação. Capacidade de criar classes, métodos, funções, etc. em tempo de execução. De preferência, distinção mínima entre código e dados, estilo Lisp.
- Sintaxe agradável, limpa e sã e semântica consistente e intuitiva. Basicamente, uma linguagem moderna bem pensada e divertida de usar.
- Vários paradigmas. Nenhum paradigma é adequado para todos os projetos, ou mesmo para todos os pequenos subproblemas de um projeto.
- Uma linguagem interessante que realmente afeta a maneira como se pensa sobre programação.
Um pouco importante:
- Atuação. Seria bom se o desempenho fosse decente, mas quando o desempenho for uma prioridade real, usarei D em seu lugar.
- Bem documentado.
Não é importante:
- Tamanho da comunidade, disponibilidade de biblioteca, etc. Nenhuma dessas são características da linguagem em si e tudo pode mudar muito rapidamente.
- Disponibilidade de trabalho. Não sou um programador profissional em tempo integral. Eu sou um estudante de graduação e a programação é tangencialmente relevante para minha pesquisa.
- Quaisquer recursos que são projetados principalmente com projetos muito grandes trabalhados por um milhão de macacos de código em mente.
python
ruby
lisp
metaprogramming
dsimcha
fonte
fonte
Respostas:
Não há realmente uma grande diferença entre python e ruby, pelo menos em um nível ideológico. Na maior parte, eles são apenas sabores diferentes da mesma coisa. Portanto, eu recomendo ver qual deles combina mais com seu estilo de programação.
fonte
Não seríamos todos nós.
Infelizmente, a distinção mínima entre código e dados e sintaxe "estranha" são consequências uma da outra.
Se quiser uma sintaxe fácil de ler, você tem o Python. No entanto, o código não é representado em nenhuma das estruturas de dados internas comumente usadas. Ele falha - como acontece com a maioria dos idiomas - no item nº 1 de sua lista de 'importantes'. Isso torna difícil fornecer ajuda útil.
Você não pode ter tudo. Lembre-se de que você não é o primeiro a ter esse pensamento. Se algo como sua linguagem ideal existisse, todos nós estaríamos usando. Já que o mundo real fica aquém de seus ideais, você terá que priorizar novamente sua lista de desejos. A seção "importante" deve ser reorganizada para identificar o que é realmente importante para você.
fonte
Honestamente, no que diz respeito aos recursos de metaprogramação, Ruby e Python são muito mais semelhantes do que alguns de seus adeptos gostam de admitir. Esta análise de ambos os idiomas oferece uma comparação / análise muito boa:
Portanto, basta escolher um com base em alguns critérios. Talvez você goste de Rails e queira estudar esse código. Talvez SciPy seja a sua praia. Observe o ecossistema de bibliotecas, comunidade, etc. e escolha uma. Você certamente não perderá algum nirvana da metaprogramação com base na sua escolha de qualquer um deles.
fonte
Isenção de responsabilidade: Eu apenas me envolvo em qualquer um dos idiomas, mas pelo menos escrevi pequenos programas de trabalho (não apenas scripts rápidos, para os quais uso Perl, bash ou GNU make) em ambos.
Ruby pode ser muito bom para os "paradigmas múltiplos" ponto 3, porque trabalha muito para facilitar a criação de linguagens de domínio específico. Por exemplo, navegue online e veja alguns bits do código Ruby on Rails e alguns bits do código Rake. Ambos são Ruby e você pode ver as semelhanças, mas eles não se parecem com o que você normalmente consideraria a mesma linguagem.
Python me parece um pouco mais previsível (possivelmente correlacionado ao ponto 2 'limpo' e 'são'), mas não sei realmente se é por causa da linguagem em si ou apenas porque é normalmente usado por pessoas com valores diferentes . Nunca tentei magia profunda em Python. Eu certamente diria que ambas as línguas são bem pensadas.
Ambos pontuam bem em 1 e 4. [Editar: na verdade, 1 é bastante discutível - há "eval" em ambos, como é comum em linguagens interpretadas, mas eles dificilmente são conceitualmente puros. Você pode definir fechamentos, atribuir métodos a objetos e outros enfeites. Não tenho certeza se isso vai tão longe quanto você deseja.]
Pessoalmente, acho Ruby mais divertido, mas em parte porque é mais fácil se distrair pensando em maneiras legais de fazer as coisas. Na verdade, usei mais o Python. Às vezes você não quer esfriar, você quer continuar, então é feito antes de dormir ...
Nenhum deles é difícil de entrar, então você pode simplesmente decidir fazer sua próxima tarefa menor em um e a seguinte no outro. Ou pegue um livro introdutório sobre cada um na biblioteca, leia os dois rapidamente e veja o que te chama a atenção.
fonte
Você já considerou Smalltalk? Ele oferece uma sintaxe muito simples, clara e extensível com recursos de refletividade e introspecção e um ambiente de desenvolvimento totalmente integrado que tira proveito desses recursos. Dê uma olhada em alguns dos trabalhos que estão sendo feitos no Squeak Smalltalk, por exemplo. Muitos pesquisadores que usam o Squeak frequentam a lista de discussão do Squeak e #squeak no freenode, para que você possa obter ajuda em questões complexas com muita facilidade.
Outros indicadores de sua relevância atual: ele roda em qualquer plataforma que você queira nomear (incluindo o iPhone ); Gilad Bracha está baseando seu trabalho em Novilíngua no Squeak; a equipe V8 começou a trabalhar em VMs Smalltalk ; e Dan Ingalls e Randal Schwartz voltaram recentemente ao trabalho em Smalltalk depois de anos no deserto.
Boa sorte com sua pesquisa - diga-nos o que você decidir no final.
fonte
Lisp satisfaz todos os seus critérios, incluindo desempenho, e é a única linguagem que não possui sintaxe (estranha). Se você o evita de forma tão espantosamente mal informado / equivocado e, conseqüentemente, perde a experiência de usar, por exemplo, Emacs + SLIME + CL, você estará prestando um grande desserviço a si mesmo.
fonte
Seus 4 pontos "importantes" conduzem exatamente ao Ruby, enquanto os 2 pontos "um tanto importantes" regidos pelo Python. Que assim seja.
fonte
Você está descrevendo Ruby.
É muito fácil estender e modificar primitivos existentes em tempo de execução. Em Ruby, tudo é um objeto, strings, inteiros e até funções.
Você também pode construir atalhos para o açúcar sintático, por exemplo com class_eval .
Ruby segue o princípio de menos surpresa e, ao comparar o código Ruby com o equivalente em outra linguagem, muitas pessoas o consideram mais "bonito".
Você pode seguir imperativo, orientado a objetos, funcional e reflexivo.
Isso é muito subjetivo, mas do meu ponto de vista, a capacidade de usar muitos paradigmas ao mesmo tempo permite ideias muito interessantes.
Eu tentei Python e não se encaixa em seus pontos importantes.
fonte
lambda
/Proc.new
mess foi chamado de "comportamento surpreendente" e "altamente contra-intuitivo" aqui no SO. :-) Qualquer linguagem tão grande e complexa como Ruby pode ter essas áreas confusas.String
em Ruby para fins de metaprogramação: coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/… . Subclasses não serviriam; entretanto, uma função simples de dois argumentos faria.Compare exemplos de código que fazem a mesma coisa (junte com uma nova linha descrições não vazias de itens de uma
myList
lista) em idiomas diferentes (os idiomas são organizados em ordem alfabética reversa):Ruby :
Ou
Python :
Ou
Perl :
Ou
Javascript :
Io :
Aqui está um guia Io .
fonte
Ruby seria melhor do que Lisp em termos de ser "mainstream" (seja lá o que isso realmente signifique, mas uma preocupação realista é como seria fácil encontrar respostas para suas perguntas sobre programação Lisp se você fosse com isso.) Em qualquer caso. , Achei Ruby muito fácil de aprender. No mesmo período de tempo que passei aprendendo Python (ou outras linguagens), logo comecei a escrever um código melhor com muito mais eficiência do que antes. Essa é apenas a opinião de uma pessoa; pegue com um grão de sal, eu acho. Eu sei muito mais sobre Ruby neste momento do que Python ou Lisp, mas você deve saber que eu era uma pessoa Python por um bom tempo antes de mudar.
Lisp é definitivamente muito bom e vale a pena dar uma olhada; como você disse, o tamanho da comunidade etc. pode mudar muito rapidamente. Dito isso, o tamanho em si não é tão importante quanto a qualidade da comunidade. Por exemplo, o
#ruby-lang
canal ainda está cheio de pessoas incrivelmente inteligentes. Lisp parece atrair algumas pessoas muito inteligentes também. Não posso falar muito sobre a comunidade Python, pois não tenho muita experiência em primeira mão, mas às vezes parece ser "grande demais". (Lembro-me de pessoas sendo muito rudes em seus canais de IRC e, pelo que ouvi de amigos que realmente gostam de Python, essa parece ser a regra, e não a exceção.)De qualquer forma, alguns recursos que você pode achar úteis são:
1) A série Pragmatic Programmers Ruby Metaprogramming ( http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming ) - não gratuita, mas os episódios posteriores são bastante intrigantes. (O código é gratuito, se você quiser fazer o download e ver o que está aprendendo.)
2) On Lisp de Paul Graham ( http://www.paulgraham.com/onlisp.html ). É um pouco antigo, mas é um clássico (e pode ser baixado gratuitamente).
fonte
Estou usando Python para muitos projetos e acho que Python fornece todos os recursos que você solicitou.
importante:
Um pouco importante:
Como você é um estudante de graduação, pode querer ler este artigo afirmando que Python é tudo o que um cientista precisa . Infelizmente não posso comparar Python com Ruby, já que nunca usei essa linguagem.
Atenciosamente, Dennis
fonte
@Jason I discordo respectivamente. Existem diferenças que tornam o Ruby superior ao Python para metaprogramação - tanto filosófica quanto pragmática. Para começar, Ruby obtém herança certa com Herança Única e Mixins . E quando se trata de metaprogramação, você simplesmente precisa entender que tudo gira em torno do eu . A diferença canônica aqui é que em Ruby você tem acesso ao objeto self em tempo de execução - em Python você não tem!
Ao contrário do Python, em Ruby não há fase de compilação ou tempo de execução separada. Em Ruby, cada linha de código é executada em um objeto self particular . Em Ruby, cada classe herda tanto do objeto quanto de uma metaclasse oculta. Isso cria uma dinâmica interessante:
Usar self.name acessa o método de nome de metaclasse das classes Ninja para retornar o nome da classe Ninja. A metaprogramação é tão bonita em Python? Eu sinceramente duvido!
fonte
Bem, se você não gosta da sintaxe lisp, talvez assembler seja o caminho a percorrer. :-)
Certamente tem uma distinção mínima entre código e dados, é multiparadigma (ou talvez não seja nenhum paradigma) e é uma experiência de expansão da mente (se tediosa) tanto em termos de aprendizado quanto nos truques que você pode fazer.
fonte
Io satisfaz todos os seus pontos "importantes". Não acho que haja uma linguagem melhor por aí para fazer meta-hackeagem maluca.
fonte
Lisp pode ser compilado.
fonte
Você experimentou Rebol?
fonte
Minha resposta seria nenhuma. Eu conheço as duas linguagens, fiz um curso de Ruby e programa em Python há vários anos. Lisp é bom em metaprogramação devido ao fato de que seu único propósito é transformar listas, seu próprio código fonte é apenas uma lista de tokens, então a metaprogramação é natural. As três linguagens que eu mais gosto para esse tipo de coisa são Rebol, Forth e Factor. Rebol é uma linguagem de dialetagem muito forte que pega o código de seu fluxo de entrada, executa uma expressão nele e o transforma usando regras escritas na linguagem. Muito expressivo e extremamente bom em dialeto. Factor e Forth são mais ou menos completamente divorciados da sintaxe e você os programa definindo e chamando palavras. Geralmente, eles são escritos em sua própria língua. Você não escreve aplicativos no sentido tradicional, você estende o idioma escrevendo suas próprias palavras para definir seu aplicativo específico. O Factor pode ser especialmente bom, pois tem muitos recursos que só vi em smalltalk para avaliar e trabalhar com código-fonte. Um espaço de trabalho muito bom, documentos interativos, etc.
fonte
Não há realmente muito para separar Python e Ruby. Eu diria que a comunidade Python é maior e mais madura do que a comunidade Ruby, e isso é muito importante para mim. Ruby é uma linguagem mais flexível, que tem repercussões positivas e negativas. No entanto, tenho certeza de que haverá muitas pessoas para entrar em detalhes nessas duas línguas, então vou colocar uma terceira opção no ringue. Que tal JavaScript?
JavaScript foi originalmente projetado para ser um esquema para a web e é baseado em protótipos, o que é uma vantagem sobre Python e Ruby no que diz respeito a multiparadigma e metaprogramação. A sintaxe não é tão boa quanto as outras duas, mas é provavelmente a linguagem mais amplamente implantada que existe, e o desempenho está melhorando a cada dia.
fonte
Se você gosta do conceito code-is-data no estilo lisp, mas não gosta da sintaxe Lispy, talvez Prolog seja uma boa escolha.
Se isso se qualifica como uma "linguagem moderna divertida de usar", deixarei para os outros julgarem. ;-)
fonte
Ruby é minha escolha depois de explorar Python, Smalltalk e Ruby.
fonte
E o OCaml?
Recursos do OCaml: um sistema de tipo estático, inferência de tipo, polimorfismo paramétrico, recursão de cauda, correspondência de padrões, fechamentos lexicais de primeira classe, functores (módulos paramétricos), tratamento de exceções e coleta de lixo automática de geração incremental.
Acho que satisfaz o seguinte:
fonte
Eu usei Python um pouco, mas muito mais Ruby. No entanto, eu diria que ambos fornecem o que você pediu.
Se eu ver todos os seus quatro pontos, você pode pelo menos verificar: http://www.iolanguage.com/
E Mozart / Oz pode ser interessante para você também: http://mozart.github.io/
Atenciosamente Friedrich
fonte
Para sintaxe de estilo python e macros semelhantes a lisp (macros que são código real) e uma boa DSL, consulte convergir .
fonte
Não tenho certeza se Python atenderia a tudo o que você deseja (especialmente o ponto sobre a distinção mínima entre código e dados), mas há um argumento a favor do python. Há um projeto por aí que facilita a programação de extensões para python em D, para que você tenha o melhor dos dois mundos. http://pyd.dsource.org/celerid.html
fonte
se você ama a rosa, você tem que aprender a conviver com os espinhos :)
fonte
Eu recomendo que você vá com Ruby.
Quando comecei a aprender, achei muito fácil de aprender.
fonte
Não misture a linguagem de programação Ruby com as implementações Ruby, pensando que threads POSIX não são possíveis no ruby.
Você pode simplesmente compilar com suporte a pthread, e isso já era possível no momento em que este tópico foi criado , com o perdão do trocadilho.
A resposta a esta pergunta é simples. Se você gosta de ceceio, provavelmente preferirá rubi. Ou o que você quiser.
fonte
Eu sugiro que você experimente os dois idiomas e escolha aquele que mais lhe agrada. Python e Ruby podem fazer o que você quiser.
Leia também este tópico .
fonte
Vá com JS, basta verificar AJS (Alternative JavaScript Syntax) no meu github http://github.com/visionmedia. Ele lhe dará alguns fechamentos com aparência mais limpa, etc: D
fonte
Em relação ao seu ponto principal (metaprogramação): A versão 1.6 do Groovy tem a programação AST (Abstract Syntax Tree) embutida como um recurso padrão e integrado. Ruby tem RubyParser, mas é um complemento.
fonte