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.
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
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
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
• 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
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
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
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
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
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
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
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
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
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
(+ 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
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
"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
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
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