Pergunta

Estou usando Clojure por pouco tempo e quer criar alguns projetos que são maiores e mais complicado do que brinquedos. Estou usando o Java para os últimos anos e tornaram-se acostumado ao que IDEs fazer por mim -. Lotes de compilação de aulas, empacotá-los em frascos, criar arquivos em lote para os usuários a iniciar-los com

Quando eu olhar para exemplos de desenvolvimento em Clojure eles parecem ser ao longo das linhas de arquivos de carga para o REPL, ver como eles funcionam, editar o arquivo, de recarga, de repetição. Nary uma classe ou frasco que está sendo gerado em qualquer lugar. Em fantástico de Stuart Halloway "Clojure Programação" Eu não poderia encontrar um único exemplo de ": gen-class", por exemplo. Os IDEs Clojure que tenho usado (ClojureBox e os NetBeans enclojure plugin) parecem promover esse mesmo fluxo de trabalho.

Isso é intencional? São as ferramentas muito imaturo ou eu simplesmente não "pegar"?

Eu gostaria de ouvir alguns exemplos de fluxo de trabalho de pessoas que criaram alguns programas não-trivial para ser usado por usuários comuns (não outros devs), se possível.

Obrigado por compartilhar suas opiniões.

Foi útil?

Solução

Eu acho que há realmente 2 perguntas aqui:

A) como implantar (e construir e gerenciar dependências). Tudo o que posso dizer sobre isso é olhar para outros projetos com objetivos semelhantes / domínios e copiá-los.

B) Fluxo de Trabalho:

O meu fluxo de trabalho é assim:

  1. abrir um arquivo e escrever algumas declarações wishful thinking alto nível

  2. começar a escrever algumas funções para apoiá-lo

2,5 copiar as definições de função para REPL como eu criá-los

  1. abrir outro arquivo e escrever alguns testes básicos para verificar os trabalhos de função

3,5 copiar estes para o REPL

  1. iterate entre os dois buffers construindo os testes até um exemplo e o programa em direção a um objetivo final. Estes eventualmente tornar-se atividades similares e eu sei que eu sou feito.

  2. embrulhar o arquivo secundário em deftest

Agora, quando eu voltar em um mês, eu só posso executar meus testes e ser feliz! Salvar seus buffers REPL pode fornecer algum valor com pouco esforço. Isso é apenas o que funciona para mim no momento, e eu estou feliz em ser educado para melhores abordagens.

Como para seleção de IDE vs REPL - a maioria das IDEs tem plugins que têm REPLs então eu não tenho certeza é um uma ou a outra escolha - realmente é apenas sobre qual editor de texto você está em produção, e como você deseja gerenciar a estrutura do projeto. Não há qualquer tipo de 'fazê-lo desta maneira' estruturas pré-fabricados AFAIK por isso neste momento é mais fácil olhar para projectos específicos (como a própria Clojure, ou penumbra ou compojure ou qualquer uma das bibliotecas listadas no site principal.

Outras dicas

A abordagem do desenvolvimento REPL tem sido incentivada pela maioria família LISP (e outra linguagem funcional) IDE por um longo tempo. Alguns destes REPL também está apresentam as características de auto-completar que você pode associar com um Java IDE.

REPL dá-lhe algumas grandes vantagens sobre a abordagem padrão. A primeira é que ele permite que você execute código arbitrário durante o tempo de execução do seu programa, que pode fazer a depuração de sistemas multi-threaded muito mais simples. Em segundo lugar, e mais importante, que torna mais fácil para testar suas funções enquanto você código. Você não precisa construir um quadro em torno de uma nova função ou classe, você pode jogar com ele diretamente na REPL, e ver como ele responde a uma variedade de casos de uso.

Bem, para começar, praticamente qualquer plugin desenvolvimento decente para qualquer editor ou IDE irá dar-lhe uma maneira de usar o Clojure REPL de dentro do IDE. Provavelmente ainda permitem que você carregar arquivos no REPL para testar e tal. Você não precisa escolher um ou outro.

Enclojure vai um longo caminho, que é de certeza. No entanto, a maioria das pessoas são perfeitamente felizes com o uso Emacs, inclusive eu. Emacs usa um Lisp como língua de configuração, por isso é geralmente a escolha mais natural para um lisper.

Para idiomas que têm REPLs, usando o REPL como uma parte importante do processo de desenvolvimento é a norma. Edição de arquivos, colocá-los na REPL, brincando com eles para ver se um trabalho, enxágüe, repita. Esta é uma das principais vantagens de línguas com REPLs como Clojure e Haskell e CL e tal.

Como para a construção de frascos, e compilar o código Clojure e outras coisas, que seja simples. Você nem sequer realmente / tem / compilar o código Clojure a maior parte do tempo, se você não quer. Quando você fizer isso, você AOT compilá-lo com gen-classe, que compila-lo para arquivos de classe que você pode, então, colocado em um frasco. Existem toneladas de exemplos e até mesmo tutoriais propagação entre os interwebs. A maneira mais fácil e mais eficiente é usar algo como Ant e escrever um script de compilação que compila código Clojure e gera o .jar para você. A primeira vez que fiz isso, eu pensei que ia ser difícil de fazer, mas foi realmente muito simples. Eu olhei para os arquivos de compilação Clojure e Clojure-contrib Ant, e referenciado as páginas de ajuda da formiga para tudo o que eu precisava.

Uma coisa que eu devo mencionar é o fato de que Enclojure / não / realmente construir arquivos .jar executáveis ??para você, se você pedir para o fazer. Eu tenho certeza que as coisas mais avançadas que você está acostumado serão adicionados no futuro. Eles são, na verdade, ainda bastante novo.

Eu uso os dois - Eclipse IDE e anti-plug-in que proporciona um REPL. Esta é uma combinação particularmente agradável se você desenvolver código Java juntamente com Clojure (como eu faço).

A minha abordagem geral é:

  • escrever código Clojure no editor
  • Mantenha um REPL aberta para testar as coisas (Ctrl + Enter é um atalho útil aqui: ele executa qualquer código é selecionado em seu editor no REPL)
  • Use as ferramentas IDE genéricos para gerenciamento de projetos, construção, testes, SCM etc.

Às vezes, eu também trabalho puramente no REPL. Isso geralmente é melhor para testar as coisas rapidamente. Se eu particularmente como um pedaço de código de teste, vou simplesmente copiar / colar do REPL em minha suíte de testes.

O que eu faço é criar um projeto com Leiningen. Se você quiser apenas para bater afastado por um tempo, você pode simplesmente digitar lein repl e seu classpath do projeto será criado para o repl.

Na verdade, porém, eu uso Emacs, lodo e clojure Swank. Depois de navegar para o projeto, basta digitar M-x clojure-jack-in . Isso inicia o servidor Swank e lodo se conecta a ele e você tem um repl em um buffer. É claro que apenas isso não vale mais do que a execução de um repl em uma concha. O que você é é a capacidade de escrever código em outro buffer, e com uma combinação de teclas sexps selecione ou unidades maiores e executá-los no repl para ver se funciona. Também limo dá-lhe keybindings úteis para tarefas comuns. Veja Swank-clojure no github para mais informações.

JohnJ, você pode fazer a mesma coisa no Emacs. Na verdade, essa frase é provavelmente uma tautologia.

(add-hook 'after-save-hook etc.

Aqui está o exemplo de alguém depois de-save-gancho para git: https://gist.github.com/449668

Com Eclipse, você pode ter testes de unidade (ou qualquer programa) são executados cada vez que você salvar um arquivo no projeto. Todo o processo leva menos de um segundo - é ótimo para o desenvolvimento orientado a testes, e elimina a necessidade de cortar e colar no REPL para a maioria das situações. Além disso, você começa a manter os testes! : -)

Você vai querer usar bolo para evitar a JVM inicialização tempo cada vez que você iniciar seus testes. Você pode executar cake test na linha de comando, ou apenas ter Eclipse executá-lo para você quando você salvar qualquer arquivo em seu projeto.

Eu tenho essa para o trabalho através da criação de um projeto com Leiningen , a instalação de bolo , e instalar o anti-horário Eclipse plugin. Para configurar o Eclipse para executar testes de cada vez que você salvar, selecione Projeto-> Propriedades-> Builders, clique em Novo, selecione Programas, chamá-lo de algo como 'testes Run', adicionar o caminho para cake em Localização, selecione o diretório de trabalho para o seu projeto e test adicionar aos argumentos opcionais. Sob a guia 'Opções construir', selecione 'Durante Auto constrói.'

Eu tive a idéia geral para este do livro de Jeff Younker, "Fundamentos de Agile Python Desenvolvimento". Foi um homem Emacs por 20 anos, mas este truque colocou Eclipse na frente do meu fluxo de trabalho recentemente.


Update:. Cerca de um ano depois, eu agora usar Midje com a opção lazytest para fazer a mesma coisa durante o desenvolvimento com ambos Emacs e Eclipse

"Quando eu olhar para exemplos de desenvolvimento em Clojure eles parecem ser ao longo das linhas de arquivos de carga para o REPL, ver como eles funcionam, editar o arquivo, de recarga, de repetição. Nary uma classe ou frasco que está sendo gerado em qualquer lugar .. .... eu gostaria de ouvir alguns exemplos de fluxo de trabalho de pessoas que criaram alguns programas não-trivial para ser usado por usuários comuns (não outros devs), se possível. "

Os exemplos em depuração clojure funções que são invocados no código java (eclipse) são triviais, mas ilustrar como no eclipse pode-se ligar projectos de tal forma que um pode invocar clojure / scala funcionalidade de dentro java.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top