Depois de alguns meses aprendendo e brincando com Lisp, CL e um pouco de Clojure, ainda não vejo uma razão convincente para escrever algo nele em vez de C #.
Eu realmente gostaria de algumas razões convincentes, ou para alguém ressaltar que estou sentindo falta de algo realmente grande .
Os pontos fortes do Lisp (de acordo com minha pesquisa):
- Notação compacta e expressiva - Mais do que C #, sim ... mas também consigo expressar essas idéias em C #.
- Suporte implícito à programação funcional - C # com métodos de extensão LINQ:
- mapcar = .Selecione (lambda)
- Mapcan = .Selecione (lambda) .Aggregate ((a, b) => a.União (b))
- carro / primeiro = .Primeiro ()
- cdr / rest = .Skip (1) .... etc.
- Suporte a funções Lambda e de ordem superior - C # possui isso, e a sintaxe é sem dúvida mais simples:
- "(lambda (x) (corpo))" versus "x => (corpo)"
- "# (" com "%", "% 1", "% 2" é bom no Clojure
- Envio de método separado dos objetos - o C # tem isso através de métodos de extensão
- Despacho multimétodo - o C # não possui isso nativamente, mas eu poderia implementá-lo como uma chamada de função em algumas horas
- Código é dados (e macros) - Talvez eu não tenha "recebido" macros, mas não vi um único exemplo em que a idéia de uma macro não pudesse ser implementada como uma função; isso não muda a "linguagem", mas não tenho certeza se isso é uma força
- DSLs - Só pode fazê-lo através da composição de funções ... mas funciona
- Programação "exploratória" não tipada - para estruturas / classes, as propriedades automáticas do C # e o "objeto" funcionam muito bem, e você pode escalar facilmente para uma digitação mais forte à medida que avança
- É executado em hardware que não é Windows - Sim, é? Fora da faculdade, conheci apenas uma pessoa que não executa o Windows em casa ou pelo menos uma VM do Windows no * nix / Mac. (Então, novamente, talvez isso seja mais importante do que eu pensava e acabei de fazer uma lavagem cerebral ...)
- O REPL para o projeto de baixo para cima - Ok, admito que isso é realmente muito bom e sinto falta dele em C #.
Coisas que estou perdendo no Lisp (devido a uma mistura de C #, .NET, Visual Studio, Resharper):
- Namespaces. Mesmo com métodos estáticos, eu gosto de amarrá-los a uma "classe" para categorizar seu contexto (Clojure parece ter isso, CL não parece).
- Excelente compilação e suporte em tempo de design
- o sistema de tipos permite determinar a "correção" das estruturas de dados que eu passo
- qualquer erro de ortografia é sublinhado em tempo real; Eu não tenho que esperar até o tempo de execução para saber
- melhorias de código (como usar uma abordagem FP em vez de uma abordagem imperativa) são sugeridas automaticamente
- Ferramentas de desenvolvimento da GUI: WinForms e WPF (sei que o Clojure tem acesso às bibliotecas da GUI do Java, mas são totalmente estranhas para mim).
- Ferramentas de depuração da GUI: pontos de interrupção, entrada e saída, inspetores de valor (texto, xml, personalizado), relógios, depuração por segmento, pontos de interrupção condicionais, janela de pilha de chamadas com a capacidade de ir para o código em qualquer nível na pilha
- (Para ser justo, minha passagem pelo Emacs + Slime parecia fornecer parte disso, mas sou parcial com a abordagem orientada a VS GUI)
Eu realmente gosto do hype em torno de Lisp e dei uma chance.
Mas há algo que eu possa fazer no Lisp que não possa fazer tão bem em C #? Pode ser um pouco mais detalhado em C #, mas também tenho preenchimento automático.
o que estou perdendo? Por que devo usar o Clojure / CL?
AND
ou OR
como uma função. Isso poderia ser feito (dado LAMBDA
, o que também é uma macro), mas não vejo uma maneira óbvia de fazê-lo que não seja totalmente ruim.