Pergunta

Meu professor disse-nos que poderíamos escolher uma linguagem de programação para o nosso próximo trabalho de programação. Eu tenho sentido de experimentar uma linguagem funcional, então eu percebi que eu experimentar Clojure. O problema é que eu entendo a sintaxe e compreender os conceitos básicos, mas eu estou tendo problemas para fazer tudo para "clicar" na minha cabeça. Alguém tem algum conselho? Ou estou talvez escolher o idioma errado para iniciar a programação funcional com?

Foi útil?

Solução

É um pouco como andar de bicicleta, ele só leva prática. Tente resolver alguns problemas com ele, talvez Project Euler e, eventualmente, ele vai clicar.

Alguém mencionou o livro "The Little Schemer", e isso é uma boa leitura bonito. Embora ele atinge Esquema os problemas reais vai valer a pena trabalhar completamente.

Boa sorte!

Outras dicas

Bem, para mim, eu encontrei o mesmo problema que você faz no início, quando eu comecei a fazer OCaml, mas o truque é que você deve começar a pensar em o que você quer a partir do código e < em> não como fazê-lo !!!

Por exemplo, para calcular o quadrado de elementos da lista, esquecer-se sobre o comprimento da lista e esses truques, apenas pensar matematicamente assim:

  • Se a lista está vazia -> Eu sou feito

  • Se não, então a lista deve ter uma cabeça e cauda -.> Calcular o quadrado da cabeça, em seguida, pedir a sua função de fazer o mesmo com a cauda

Basta pensar sobre o caso geral e uma base, e que você está emitindo dados e não modificá-lo (a menos que queira modificá-lo;)).

Boa sorte!

Você pode verificar para fora The Little Schemer .

Como sobre este: http://www.defmacro.org/ramblings/lisp.html

É uma forma muito simples, passo-a-passo introdução ao pensamento em Lisp do ponto de vista de um programador regulares imperativo (Java, C #, etc.).

Para fins educacionais Eu recomendaria PLT Scheme. É um ambiente portátil e potente com muito bons exemplos e uma documentação ainda melhor. Ele vai ajudar você a descobrir os pensamentos por trás passo programação funcional a passo e de uma forma muito limpa. A escolha de um pequeno aplicativo para implementar irá ajudá-lo a aprender o novo idioma.

http://www.plt-scheme.org/

Além disso "Estrutura e Interpretação de Programas de Computador" de H. Abelssn, G. Sussman, e J. Sussman é um livro muito bom sobre Scheme (e programação).

Saudações

mue

Dê uma olhada 99 problemas lispy

Algumas reflexões sobre Lisps, não é específico para Clojure (eu não sou um especialista em Lisp, então eu espero que eles são principalmente correta e útil):

Codificação em AST

Eu sei pouco sobre compilador ou teoria intérprete, mas cada código I vez em Lisp, espanta-me que ela se sente como construir diretamente uma AST.

Isso é parte do que "código = dados" significa, codificação em Lisp é muito parecido com o preenchimento estruturas de dados (listas aninhadas) com nós AST. Incrível, e é fácil de ler muito (com o editor de texto à direita).

A Programmable Linguagem de programação

Assim, pedaços de código são apenas listas aninhadas, e operações de lista fazem parte da língua. Assim, você pode muito facilmente escrever código Lisp que gera código Lisp (veja macros Lisp). Isso faz com que Lisp um programável (em si!) Linguagem de programação.

Isso faz com que a construção de um DSL ou um intérprete em Lisp é muito fácil (ver também meta-circular avaliação).

Nunca reiniciar qualquer coisa

E na maioria dos sistemas Lisp, código (incluindo a documentação) podem ser introspectivos e quente trocados em tempo de execução.

Avançado OOP

Em seguida, a maioria dos sistemas Lisp têm algum tipo de objeto Sistema derivado de CLOS, que é um avançado (em comparação com muitas implementações OOP) e configurável objeto System (veja a Arte da metaobjeto Protocolo ).

Todas estas características, onde inventados há muito tempo, mas eu não tenho certeza que eles estão disponíveis em muitas outras linguagens de programação (embora a maioria estão a recuperar, por exemplo, com fechos), então você tem que "redescobrir" e se acostumar com estes, praticando (veja os livros em outras respostas).

Apenas lembre-se: é tudo de dados

Escreva algumas funções clássicas simples que Lisp é bom, como

  • reverter uma lista

  • dizer se um átomo está em algum lugar em uma s-expressão

  • gravar EQUAL dizer se 2 s-expressões são iguais

  • gravar FRANJA para obter a lista de átomos na orla de uma s-expressão

  • gravar SUBST, em seguida, escrever sublis

  • diferenciação simbólica

  • Algébrica simplificação

  • escrever uma simples EVAL e / ou APLICAR

Entenda que Lisp é bom para estes tipos de programas funcionais não-side-effect.

Também é útil para programas de efeitos colaterais stateful (não-funcionais), mas esses são mais como "programas" do que "funções".

O que é melhor para uma determinada aplicação depende da aplicação. Em geral, deve não menos conter, e não mais, informações sobre o estado do que o necessário.

Fácil!

M-x lisp-mode

OK, OK, então você pode não ter Emacs para um cérebro. Em toda a seriedade, o que você precisa fazer é para ficar realmente bom em recursão. Isso pode ser bastante uma urdidura do cérebro inicialmente ao tentar estender o conceito de recursividade além dos exemplos canônicos, mas no final vai resultar em um código mais fluido, lispy.

Além disso, muitas pessoas ficam penduradas sobre o parêntese, e eu realmente não sei por que - a sintaxe é muito simples e consistente e pode ser dominado em poucos minutos. Para mim, eu vim ao Esquema depois de ter aprendido C ++ e Java, e eu sempre pensei que a diferença entre "funções" e "operadores" era uma falsa dicotomia, e foi refrescante para ver essa distinção eliminado.

Quanto programação funcional vai, contanto que você pode quebrar a cabeça em torno do fato de que uma função é um valor de primeira classe e pode ser transmitida tanto dentro e fora de outras funções que você deve estar bem. A utilidade deste ficará claro ao longo do tempo, mas é o suficiente para que você pode escrever e funções retornando função de tirar função.

Finalmente, eu não tenho certeza do que apoiar Clojure tem para macros, mas eles são considerados uma parte essencial de lisp. No entanto, eu não me preocuparia sobre aprender-los até que você esteja profundamente familiarizado com os itens acima -. Embora macros são incrivelmente útil e versátil, eles também são usados ??com menos frequência do que as outras técnicas que eu mencionei

Eu começaria com uma linguagem que pode ser interpretada. Eu encontrei Moscow ML para ser bastante fácil. É uma implementação leve do ML padrão.

A minha prática pessoal é encontrar um projeto pequeno (algo que pode demorar 3-5 noites mexer) e implementá-lo. Que tal uma ferramenta de filtro blog? Talvez apenas a Torres de Hanói ou implementação lista vinculada (aqueles são geralmente projectos 1-noite).

A forma como ele geralmente funciona é que eu implementá-lo mal pela primeira vez, jogue fora o que eu tinha, e ele finalmente clica algumas horas.

A grande ajuda está fazendo um curso de algo como ... um ... LISP! :) A casa vai forçá-lo a enfrentar uma série de conceitos e clicado para mim muito antes do semestre findo.

Boa sorte !!

Boa sorte. Levei até cerca de meio caminho através das "Linguagens de Programação" curso na faculdade antes Scheme "clicado". Quando isso aconteceu, porém, tudo o que acabou de fazer sentido, e eu caí no amor com programação funcional.

Escrever um interpretador Lisp em Lisp.

Se você não tiver alrady, ler sobre o que faz lisp uma linguagem única. Se você não fizer isso primeiro, você vai estar tentando fazer as mesmas coisas que você poderia fazer em algumas outras linguagens de programação.

Em seguida, tentar implementar alguma coisa pequena (tentar torná-lo útil para você ou você pode não ter a motivação).

Lisp em uma caixa é uma ótima maneira de obter seus pés molhados.

Para mim o importante é ter a certeza que fazer tudo de uma forma 'lisp-y'. Não ser tentado a pensar 'Em Java eu ??usaria um loop for aqui, como eu faço para loops em Lisp? mas para ir através de exemplos e tutoriais suficientes (como alguém salientou, SICP é perfeito para isso) que você pode começar a detectar quando olhares de código 'Lisp-y' e reconhecer paradigmas de linguagem comum.

Eu certamente sabe o sentimento de olhar para algum código que eu acabei de escrever e intuitivamente sabendo que é corretamente idiomática para esse idioma e plataforma / framework - que, penso eu, é quando ele 'cliques'

.

Editar : E parabéns para a escolha de uma linguagem funcional, os estudantes menores teria apenas feito isso em Java:)

Quem disse que está indo para clicar? Estou sempre confuso

Mas se você pensar sobre o quanto abstração é possível esconder, atrás macros lisp. Em seguida, seu cérebro vai explodir.

:)

Eu confira programação Clojure. É um grande livro para não-lispers.

Além do que outros SO'ers já sugeri, aqui estão meus 2 centavos:

  1. Inicie a aprendizagem da língua e experimentar alguns simples problemas numérica / passatempo no idioma
  2. IMPORTANTE: Post a solução / código para StackOverflow, pedindo a opinião das pessoas se isso é realmente o lispy maneira para fazê-lo.

Boa sorte!

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