Upgrade to Pro — share decks privately, control downloads, hide ads and more …

LISP_Clojure

 LISP_Clojure

Esta apresentação ocorreu na disciplina de Introdução a Programação Funcional. O objetivo foi abordar uma linguagem de programação funcional. A linguagem apresentada foi o LISP e o Clojure (um dialeto de LISP) é explorado em nível de código.

Doglas A. Finco

December 03, 2019
Tweet

Other Decks in Education

Transcript

  1. LISP - História • Lisp é uma família de linguagens

    de programação concebida por John McCarthy em 1958. • Num artigo, ele mostra que é possível usar exclusivamente funções matemáticas como estruturas de dados elementares (o que é possível a partir do momento em que há um mecanismo formal para manipular funções: o Cálculo Lambda de Alonzo Church). • A motivação de McCarthy surgiu da ideia de desenvolver uma linguagem algébrica para processamento de listas para trabalho em IA (inteligência artificial). • Durante os anos de 1970 e 1980, Lisp se tornou a principal linguagem da comunidade de inteligência artificial. • O seu nome vem de List Processing (a lista é a estrutura de dados fundamental desta linguagem). Tanto os dados como o programa são representados como listas. 2
  2. LISP – História • Algumas dessas ideias foram tiradas de

    outros idiomas, mas a maioria era nova. No final do período inicial, ficou claro que essa combinação de ideias criava um sistema matemático elegante e uma linguagem de programação prática. • Nas décadas de 80 e 90 dois dialetos se auto afirmaram como os únicos extensamente disponíveis e de boa usabilidade: Common LISP e Scheme. 3
  3. Novidades trazidas pelo LISP • LISP foi a segunda linguagem

    de alto nível desenvolvida (a primeira foi FORTRAN); • Uso de condicionais. Condicionais do tipo if-then-else só aparecem pela primeira vez no Lisp; • Garbage Colector; • Recursividade. Lisp foi a primeira linguagem a implementar este conceito com sucesso; 4
  4. Linha do tempo de linguagens que segue o dialeto LISP

    • Lisp 1.5 (1955 – 1965)/Dialeto: primeira implementação distribuída por McCarthy e outros do MIT. • Scheme (1975 – mantido até hoje)/Dialeto: diferente de Common Lisp, linguagem que usa dialeto Lisp. • Common Lisp (1980 – mantido até hoje)/Dialeto: aka Common Lisp the Language (a linguagem) – as tentativas e divergência entre ZetaLisp, Spice Lisp, nil, e S-1 Lisp para criar um dialeto sucessor para Maclisp. Common Lisp estava disponível para plataformas de grande alcance e foi aceita por muitos como padrão. • Clojure (2005 – mantido até hoje)/Dialeto/Implementação: começou sendo baseado em Common Lisp rodando na JVM (Java Virtual Machine), trazendo retrocompatibilidade com todas as linguagens que rodam na JVM. É possível importar classes Java, por exemplo. • Rum (2017 – mantido até hoje)/Dialeto/Implementação: implementado em Go, projeto extremamente novo. 5
  5. Principais Aplicações • Lisp é uma linguagem madura, concebida atenciosamente,

    altamente portável, linguagem de força industrial. Suas características que mais chamam atenção são: • Ferramenta rápida e altamente personalizável para fazer coisas do dia a dia. • Aplicações grandes, complexas e críticas as quais seriam impossíveis desenvolver em outra linguagem. • Prototipação rápida e Rapid Application Development (RAD). • Aplicações de alta disponibilidade, principalmente aquelas que necessitam de mudanças após a etapa inicial. • A linguagem teve um grande sucesso em software do ramo de negócios, engenharia, processamento de documentos, hipermídia (incluindo a Web), matemática, gráficos e animação (Mirai), inteligência artificial e processamento de linguagem natural. 6
  6. Uso de LISP • Lisp foi utilizado para desenvolver o

    primeiro sistema computacional de matemática simbólica, o Macsyma. • Ele também é utilizado como linguagem de extensão do software de CAD AutoCAD, desenvolvido pela AutoDesk. O editor de textos Emacs também utiliza Lisp como linguagem de extensão. • A ITA software desenvolveu um sistema de reserva de passagens chamado Orbitz em LISP, ele é utilizado por diversas companhias aéreas. A Symbolics criou um sistema de modelagem 3D que depois foi adquirido pela IZWare e atualmente se chama Mirai, ele foi utilizado nos efeitos do filme Senhor dos Anéis. • O LISP foi utilizado pelo Paul Graham para desenvolver o sistema de e- commerce da Viaweb, que posteriormente foi vendido para o Yahoo por US$ 40 milhões. 7
  7. Clojure - História • Dialeto do Lisp; • Criado por

    Rich Hickey em 2007; • A primeira versão estável foi a versão 1.0, lançada em 4 de maio de 2009. • É executada na Máquina Virtual Java (JVM) por padrão, mas existem versões alternativas para outros ambientes de execução, como Clojure CLR, que compila código para a plataforma .NET e ClojureScript, que compila código Clojure para JavaScript. • O compilador é um arquivo JAR executável, clojure.jar , que pega o código gravado na linguagem Clojure e o compila transformando-o no bytecode da Java Virtual Machine (JVM). • Clojure incentiva imutabilidade. 8
  8. Clojure – Motivo da Criação e Utilização • Rich Hickey

    desenvolveu a linguagem Clojure por desejar uma versão moderna da linguagem Lisp para programação funcional, associada com a já estabelecida plataforma Java, e desenhada para computação concorrente. • Aspectos interessantes: https://clojure.org/ • Histórias de Sucesso; • Recursos. • Clojure é utilizada no backend de aplicações que exigem muito processamento e performance, pois possui excelente suporte a programação concorrente e lazy- evaluation, que permite melhor aproveitamento dos recursos físicos, facilitando inclusive a clusterização de sua execução. • Roda na JVM e é usada pelo Twitter, Walmart, Netflix e Nubank; 9
  9. Procedimentos utilizados para instalação e utilização • A melhor ferramenta

    para começarmos a explorar o Clojure é o Leiningen. Esta ferramenta gerencia dependências e automatiza a compilação, execução de testes e geração de pacotes binários, além de permitir o uso de uma grande quantidade de plugins. (Semelhante ao mix no Elixir). • O Emacs, o editor mais popular entre os Clojuristas. Você absolutamente não precisa usar o Emacs para o desenvolvimento de Clojure, mas o Emacs oferece forte integração com o Clojure REPL e é adequado para escrever código Lisp. • Via terminal: lein repl • https://whatthefunctional.wordpress.com/2018/10/06/getting-started-with- clojure-on-windows/ 10
  10. Hello World – Via terminal user => (println "Hello World")

    Hello World nil • Todas as funções em Clojure retornam algo, por isso que existe o nil; • https://clojurebridge.org/community-docs/docs/getting- started/helloworld/ 11
  11. Livro: Clojure para os bravos e verdadeiros. Autor: Daniel Higginbotham

    Disponível em: https://www.braveclojure.com/ Código dos exercícios: https://nostarch.com/clojure/ 12
  12. Sintaxe • Todo o código Clojure é escrito em uma

    estrutura uniforme. Clojure reconhece dois tipos de estruturas: • Representações literais de estruturas de dados (como números, seqüências de caracteres, mapas e vetores) 1 "a string" ["a" "vector" "of" "strings"] • Operações (operator operand1 operand2 ... operandn) (+ 1 2 3) (str "It was the panda " "in the library " "with a dust buster") • Todos os Lisps, incluindo Clojure, empregam notação de prefixo , o que significa que o operador sempre vem em primeiro lugar em uma expressão. 13
  13. Controle de Fluxo Se: (if boolean-form then-form optional-else-form) (if true

    "By Zeus's hammer!“ "By Aquaman's trident!") (if false "By Zeus's hammer!" "By Aquaman's trident!") 14
  14. Nomeando valores com def • Você usa def para ligar

    um nome a um valor no Clojure: (def failed-protagonist-names ["Larry Potter" "Doreen the Explorer" "The Incredible Bulk"]) 15
  15. Estruturas de dados • O Clojure vem com várias de

    estruturas de dados que você usará na maior parte do tempo. • Todas as estruturas de dados do Clojure são imutáveis, o que significa que você não pode alterá-las no lugar. • Adicionar elemento ao final de um vetor: (conj [1 2 3] 4) • Criando uma lista: '(1 2 3 4) • Recuperar o elemento de uma lista: (nth '(:a :b :c) 0) 16
  16. Mapas • Os mapas são semelhantes a dicionários ou hashes

    em outros idiomas. Eles são uma maneira de associar algum valor a outro valor. • Neste exemplo, :first-name e :last-name são palavras-chave: {:first-name "Charlie" :last-name "McFishwich"} 17
  17. Funções • Alguns exemplos de chamada de Funções: • Soma:

    (+ 1 2 3 4) • Multiplicação: (* 1 2 3 4) • Pegar elemento de um vetor: (first [1 2 3 4]) • As definições de função são compostas por cinco partes principais: • defn • Nome da função • Uma docstring descrevendo a função (opcional) • Parâmetros listados entre colchetes • Corpo da função 18
  18. Funções – Exemplo 1 (defn boas-vindas "Dá boas vindas a

    uma pessoa" [nome] (str "Seja bem-vindo meu amigo " nome " feliz em te ver aqui!")) (boas-vindas "Doglas") ; => "Seja bem-vindo meu amigo Doglas feliz em te ver aqui!" 19
  19. Funções – Exemplo 2 (defn favorite-things [name & things] (str

    "Hi, " name ", here are my favorite things: " (clojure.string/join ", " things))) (favorite-things "Doreen" "gum" "shoes" "kara-te") ; => "Hi, Doreen, here are my favorite things: gum, shoes, kara-te" 20
  20. Funções Anônimas • No Clojure, as funções não precisam ter

    nomes. (fn [param-list] function body) (map (fn [name] (str "Hi, " name)) ["Darth Vader" "Mr. Magoo"]) ; => ("Hi, Darth Vader" "Hi, Mr. Magoo") ((fn [x] (* x 3)) 8) ; => 24 21
  21. Funções Anônimas • Você pode até associar sua função anônima

    a um nome: (def my-special-multiplier (fn [x] (* x 3))) (my-special-multiplier 12) ; => 36 Algumas outras situações: https://www.braveclojure.com/do-things/ 22
  22. Executar script .clojure • Quando estiver no REPL, carregue o

    arquivo de código: • (load-file "my-script.clj") • Exemplo Teste: cria_functions.clj • https://medium.com/trainingcenter/iniciando-estudos-na-linguagem- de-programa%C3%A7%C3%A3o-clojure-d4cb3801234e 23
  23. Existem também • Como trabalhar com listas, vetores, mapas e

    conjuntos com as funções map, reduce, into, conj, concat, some, filter, take, drop, sort, sort-by, e identity. Você também vai aprender a criar novas funções com apply, partiale complement. • https://www.braveclojure.com/core-functions-in-depth/ 24
  24. Criação de Projeto • lein new helloworld • Adicione main

    ao project.clj • Edite src / helloworld / core.clj • lein run • https://clojurebridge.org/community-docs/docs/getting- started/helloworld/ 26