{"id":789,"date":"2010-09-11T21:19:37","date_gmt":"2010-09-12T00:19:37","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=789"},"modified":"2010-09-12T12:44:34","modified_gmt":"2010-09-12T15:44:34","slug":"primeiros-passos-com-clojure-iniciando-com-o-pe-direito","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=789","title":{"rendered":"Primeiros passos com Clojure &#8211; Iniciando com o p\u00e9 direito"},"content":{"rendered":"<p><a href=\"http:\/\/www.clojure.org\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-735\" style=\"margin-left: 10px; margin-right: 10px;\" title=\"clojure-icon\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/07\/clojure-icon.gif\" alt=\"\" width=\"150\" height=\"150\" \/><\/a> Clojure \u00e9 um t\u00f3pico que tem ocupado boa parte do meu tempo nos \u00faltimos meses. \u00c9 a realiza\u00e7\u00e3o de um sonho antigo: ver <strong>uma variante do Lisp emplacando no ambiente corporativo<\/strong>. Isto porqu\u00ea a linguagem \u00e9 feita para ser executada dentro de uma m\u00e1quina virtual. Atualmente, h\u00e1 implementa\u00e7\u00f5es da linguagem tanto para a JVM quanto para a CLR, o que possibilita reaproveitamento total do nosso c\u00f3digo legado, al\u00e9m de, \u00e9 claro, todas as bibliotecas e componentes que amamos e estamos acostumados a trabalhar.<\/p>\n<p>Se voc\u00ea ainda n\u00e3o conhece, Clojure \u00e9 um dialeto do Lisp criado por Rich Hickey. O significado do seu nome j\u00e1 nos diz alguma coisa: \u00e9 um trocadilho com <em>closure, <\/em>referenciando seu car\u00e1ter funcional. Tamb\u00e9m \u00e9 um anagrama: \u00a0\u00a0<strong>C<\/strong>LR, <strong>Lisp<\/strong> e\u00a0<strong>J<\/strong>VM\u00a0(recomendo a leitura <a href=\"http:\/\/www.computerworld.com.au\/article\/313989\/a-z_programming_languages_clojure\/\" target=\"_blank\">desta entrevista<\/a> com o autor da linguagem sobre o assunto). Outro objetivo por tr\u00e1s da cria\u00e7\u00e3o da linguagem foi facilitar ao m\u00e1ximo a cria\u00e7\u00e3o de sistemas escal\u00e1veis em ambientes paralelizados.<\/p>\n<p>(daqui pra frente vou usar os termos Lisp e Clojure como se fossem a mesma linguagem (sim, eu sei que s\u00e3o diferentes&#8230;))<\/p>\n<h2>Come\u00e7ando com o p\u00e9 direito<\/h2>\n<p><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/09\/lisp_cycles.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-790\" title=\"lisp_cycles\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/09\/lisp_cycles.png\" alt=\"\" width=\"640\" height=\"211\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/09\/lisp_cycles.png 640w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/09\/lisp_cycles-300x98.png 300w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p>Se voc\u00ea quer come\u00e7ar com o p\u00e9 direito em Clojure, \u00e9 preciso ter os seguintes pontos em mente mesmo que em um primeiro momento n\u00e3o os compreenda:<\/p>\n<ul>\n<li><strong><span style=\"color: #008000;\"><span style=\"color: #000000;\">Enquanto em uma linguagem OO o foco est\u00e1 nos substantivos, em Lisp (e outras linguagens funcionais) temos a <\/span><span style=\"color: #000000;\">vingan\u00e7a dos verbos<\/span><\/span><\/strong>. Voc\u00ea n\u00e3o modela seus sistemas pensando em estruturas de classes (substantivos), mas sim fun\u00e7\u00f5es (verbos).<\/li>\n<li><span style=\"color: #000000;\"><strong>Vari\u00e1veis s\u00e3o raras<\/strong>.<\/span> Em Clojure impera o imut\u00e1vel. Este foco na imutabilidade facilita a cria\u00e7\u00e3o de sistemas concorrentes, pois torna desnecess\u00e1ria a implementa\u00e7\u00e3o de locks. O c\u00f3digo tamb\u00e9m fica melhor: \u00e9 muito mais f\u00e1cil de testar e compreender, pois \u00e9 BEM mais previs\u00edvel.<\/li>\n<li><strong>Homoiconicidade<\/strong> &#8211; Todo programa escrito em Clojure \u00e9 tamb\u00e9m uma estrutura de dados. Eu sei que \u00e9 estranho, mas n\u00e3o se assuste: falarei mais sobre isto neste post.<\/li>\n<li><strong>Uma linguagem program\u00e1vel<\/strong> &#8211; Todas as variantes do Lisp possuem algum sistema de macros que permitem aos programadores extender a linguagem caso necess\u00e1rio. Sabe esta hist\u00f3ria toda sobre o Java 7 n\u00e3o sair nunca? Pois \u00e9: se Lisp n\u00e3o possui algum construtor sint\u00e1tico que voc\u00ea precise, implemente-o!. N\u00e3o \u00e9 preciso ficar esperando que algu\u00e9m o fa\u00e7a por voc\u00ea. ;)<\/li>\n<\/ul>\n<h2>A sintaxe &#8220;alien\u00edgena&#8221;<\/h2>\n<p>A primeira vez que topei com a sintaxe do Lisp pensei: &#8220;alien\u00edgenas devem programar nisto&#8221;. Conforme fui me acostumando com ela, no entanto, a situa\u00e7\u00e3o em grande parte se inverteu.<\/p>\n<p>Assim como em Lisp, Clojure tem sua sintaxe baseada em express\u00f5es-S (S-Expressions, symbolic expressions). Estas express\u00f5es s\u00e3o primeiro parseadas como uma estrutura de dados pelo interpretador para, em seguida, serem compiladas para execu\u00e7\u00e3o. \u00c9 a homonoiconicidade em a\u00e7\u00e3o.<\/p>\n<p>Estas express\u00f5es-s possuem a seguinte sintaxe:<\/p>\n<p style=\"text-align: center;\">\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">(elemento1 elemento2 elemento3 elemento4 ... elemento_n)<\/pre>\n<p>Como pode ser visto, s\u00e3o apenas listas de elementos colocadas entre par\u00eanteses. Estes elementos podem ser de qualquer tipo, inclusive podendo variar de tipo dentro de uma mesma lista. Todas as express\u00f5es abaixo s\u00e3o v\u00e1lidas<\/p>\n<p style=\"text-align: left;\">\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">(1 2 3 4 5)\r\n(&quot;coisas&quot; &quot;da&quot; &quot;vida&quot; 1979 true false (&quot;uma&quot; &quot;lista&quot; &quot;interna&quot;))<\/pre>\n<p>Dentro do jarg\u00e3o &#8220;lispiano&#8221;, os elementos que n\u00e3o s\u00e3o listas s\u00e3o chamados \u00e1tomos. H\u00e1 basicamente dois tipos de dados em Lisp: listas e \u00e1tomos.<\/p>\n<p>No primeiro exemplo temos uma lista de inteiros, no segundo misturamos strings, um n\u00famero, vari\u00e1veis booleanas e at\u00e9 uma lista dentro da lista. No final das contas, a lista \u00e9 quem domina. N\u00e3o \u00e9 a toa que Lisp quer dizer &#8220;List Processing&#8221;.<\/p>\n<h3>Fun\u00e7\u00f5es em a\u00e7\u00e3o<\/h3>\n<p>Imagine que digitamos a seguinte lista para ser executada por Clojure:<\/p>\n<p style=\"text-align: left;\">\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">(+ 1970 9)<\/pre>\n<p>A primeira coisa a ser feita pelo interpretador ser\u00e1 obter o primeiro elemento da lista: &#8220;+&#8221;. Em seguida, ser\u00e1 feita uma busca na lista interna de fun\u00e7\u00f5es. Caso seja encontrada uma fun\u00e7\u00e3o com o mesmo nome, Clojure ir\u00e1 pegar os elementos restantes da lista e pass\u00e1-los como par\u00e2metros a esta fun\u00e7\u00e3o, que por sua vez retornar\u00e1 um valor. Caso contr\u00e1rio, ser\u00e1 exposta uma mensagem de erro. Sendo assim, as duas listas que expus anteriormente disparariam um erro: afinal de contas, n\u00e3o existe uma fun\u00e7\u00e3o chamada 1 ou &#8220;coisas&#8221;.<\/p>\n<p>Por default, toda lista \u00e9 executada por Clojure. Sendo assim, cabe a pergunta: tem como evitar isto? A resposta \u00e9 sim: basta usar o quote (&#8216;). Ao colocarmos um caractere de \u00e1spas simples antes da lista, estamos dizendo ao interpretador que aquela lista n\u00e3o \u00e9 um c\u00f3digo execut\u00e1vel. Sendo assim, o c\u00f3digo abaixo funcionaria sem problemas:<\/p>\n<p style=\"text-align: left;\">\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n'(1 2 3 4 5)\r\n'(&quot;coisas&quot; &quot;da&quot; &quot;vida&quot; 1979 true false (&quot;uma&quot; &quot;lista&quot; &quot;interna&quot;))\r\n(+ 1970 9)\r\n<\/pre>\n<p style=\"text-align: left;\">Na realidade, o caractere &#8216; \u00e9 uma macro do interpretador. Ela equivale \u00e0 fun\u00e7\u00e3o quote. (quote (1 2 3 4 5) e &#8216;(1 2 3 4 5) possuem o mesmo resultado.<\/p>\n<p style=\"text-align: left;\">Podemos definir fun\u00e7\u00f5es de duas maneiras: anonimamente ou n\u00e3o. Se quisermos definir uma fun\u00e7\u00e3o n\u00e3o an\u00f4nima, usamos a fun\u00e7\u00e3o defn, cuja sintaxe \u00e9 a seguinte:<\/p>\n<p style=\"text-align: left;\">\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">(defn nome_da_fun\u00e7\u00e3o &#x5B;parametros que espera receber] (express\u00f5es S))<\/pre>\n<p style=\"text-align: left;\">Se quis\u00e9ssemos criar uma fun\u00e7\u00e3o que somasse dois n\u00fameros, a escreveria assim:<\/p>\n<p style=\"text-align: left;\">\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">(defn soma &#x5B;x y] (+ x y))<\/pre>\n<p style=\"text-align: left;\">Nossa fun\u00e7\u00e3o se chamaria <em>soma<\/em>, e receberia dois par\u00e2metros: <em>x<\/em> e <em>y<\/em>. Em seguida, ela retornar\u00e1 o valor da express\u00e3o (+ x y). Aten\u00e7\u00e3o para o escopo: os par\u00e2metros x e y existem apenas dentro do corpo da nossa fun\u00e7\u00e3o. Se formos comparar com a implementa\u00e7\u00e3o em Groovy, vemos que n\u00e3o \u00e9 t\u00e3o alien\u00edgena assim:<\/p>\n<p style=\"text-align: left;\">\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">def soma(x, y) { x + y }<\/pre>\n<p style=\"text-align: left;\">Mas esta fun\u00e7\u00e3o \u00e9 boba. Vamos para um caso mais complexo: imaginemos uma fun\u00e7\u00e3o que nos retorne todos os n\u00fameros presentes em uma lista que sejam divis\u00edveis por 2. Em Groovy, eu poderia implement\u00e1-la assim:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\ndef pares(lista) {\r\n\r\ndef resultado = &#x5B;]\r\nfor (item in lista) {\r\nif (item % 2 == 0) resultado.add(item)\r\n}\r\nresultado\r\n}\r\n<\/pre>\n<div>A mesma fun\u00e7\u00e3o em Clojure poderia ser implementada em uma linha:<\/div>\n<div style=\"text-align: left;\">\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">(defn pares &#x5B;lista] (filter (fn &#x5B;x] (= (rem x 2) 0)) lista))<\/pre>\n<\/div>\n<div>Lisp \u00e9 A linguagem quando queremos trabalhar com listas. Neste exemplo vemos a cria\u00e7\u00e3o de uma fun\u00e7\u00e3o an\u00f4nima, no caso, criada usando a fun\u00e7\u00e3o fn. Repare: \u00e9 quase a mesma sintaxe de <em>defn<\/em>: a diferen\u00e7a \u00e9 que n\u00e3o passo um nome. Usei tamb\u00e9m a fun\u00e7\u00e3o interna <em>filter<\/em>, que recebe dois par\u00e2metros: uma fun\u00e7\u00e3o que retorna verdadeiro ou falso (por esta raz\u00e3o usei uma fun\u00e7\u00e3o an\u00f4nima) e uma lista. Ela retorna uma nova lista na qual todos os elementos passaram no teste definido na minha fun\u00e7\u00e3o an\u00f4nima. Lindo n\u00e9?<\/div>\n<div>Claro, eu poderia ter implementado esta mesma fun\u00e7\u00e3o com duas linhas, tal como no exemplo abaixo:<\/div>\n<div style=\"text-align: left;\">\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">(defn par? &#x5B;x] (= (rem x 2) 0))\r\n(defn pares &#x5B;lista] (filter par? lista))<\/pre>\n<\/div>\n<div>Ei? Reparou que bacana? Assim como em Groovy, eu uso fun\u00e7\u00f5es como se fossem dados. Eu posso passar uma fun\u00e7\u00e3o como um par\u00e2metro pra outra. Estas fun\u00e7\u00f5es tratadas como dados s\u00e3o o que, no jarg\u00e3o da programa\u00e7\u00e3o funcional chamamos de <strong>fun\u00e7\u00f5es de primeira ordem<\/strong>.<\/div>\n<div>E o mais bacana \u00e9: nestes poucos par\u00e1grafos voc\u00ea viu a maior parte do que precisa conhecer para come\u00e7ar o seu caminho com Clojure. Uns 80% (to chutando a porcentagem) da sintaxe do Lisp est\u00e1 exposta s\u00f3 nestes par\u00e1grafos.<\/div>\n<h2>Instalando o bicho<\/h2>\n<div>Atualmente Clojure se encontra na vers\u00e3o 1.2.0. No site oficial \u00e9 poss\u00edvel baixar a distribui\u00e7\u00e3o no formato .zip. Como requisito, voc\u00ea deve possuir o java no seu path. O teste \u00e9 f\u00e1cil: na linha de comando execute o comando &#8220;java&#8221;. Se n\u00e3o estiver no path, adicione-o.<\/div>\n<div>1. Descompacte a sua distribui\u00e7\u00e3o em um diret\u00f3rio de sua escolha. Vamos chamar este diret\u00f3rio de $CLOJURE_HOME<\/div>\n<div>2. Crie um arquivo em lote para iniciar o Clojure. Abaixo seguem as vers\u00f5es para Windows e Linux (ou Mac OS)<\/div>\n<div>Vers\u00e3o Linux\/Mac OS. Vamos cham\u00e1-lo de simplesmente clojure. Supondo que $CLOJURE_HOME esteja no diret\u00f3rio do usu\u00e1rio<\/div>\n<div>java -cp .:~\/clojure\/*: -jar ~\/clojure\/clojure.jar $1<\/div>\n<div>Este script pode ser usado inclusive para executar seus programas feitos com a linguagem.<\/div>\n<div>Vers\u00e3o Windows. Vamos cham\u00e1-lo de clojure.bat. Supondo que $CLOJURE_HOME esteja em c:\\clojure<\/div>\n<div>java -cp .;c:\\clojure\\*: -jar c:\\clojure\\clojure.jar %1<\/div>\n<div><strong>Dica<\/strong>: Em ambos os casos, estou definindo como classpath o diret\u00f3rio $CLOJURE_HOME. Se houverem bibliotecas Java que voc\u00ea use com frequencia, como por exemplo drivers JDBC, copie-os para este diret\u00f3rio: assim eles estar\u00e3o dispon\u00edveis para o seu interpretador Clojure.<\/div>\n<div>Adicione seu script ao path do seu sistema. Para testar sua instala\u00e7\u00e3o, execute-o na linha de comando. Se voc\u00ea tiver uma sa\u00edda tal como a abaixo, \u00e9 sinal de que tudo est\u00e1 ok.<\/div>\n<div>\n<div>Clojure 1.2.0<\/div>\n<div id=\"_mcePaste\">user=&gt;<\/div>\n<\/div>\n<div>Este \u00e9 o REPL (Read Eval Print Loop). Toda variante do Lisp possui um. \u00c9 como o groovyconsole. A diferen\u00e7a \u00e9 que o usamos para testar\/executar c\u00f3digo Clojure. Falaremos mais sobre eles em um pr\u00f3ximo post. Mas enquanto isto, brinque um pouco com ele redigitando o c\u00f3digo que expus acima. Este contato inicial (mais \u00edntimo) \u00e9 fundamental.<\/div>\n<h2>Concluindo<\/h2>\n<p>Mostrei aqui apenas o b\u00e1sico do b\u00e1sico do Clojure. Vimos apenas fun\u00e7\u00f5es absurdamente simples, compostas por uma \u00fanica linha. H\u00e1 uma raz\u00e3o: quando comecei a aprender Lisp, me perdia com as fun\u00e7\u00f5es maiores. Se eu tivesse sido mais paciente naquele momento, estaria hoje muito mais avan\u00e7ado na linguagem. N\u00e3o quero que voc\u00ea repita o mesmo erro.<\/p>\n<p>Tenho apostado <strong>muito<\/strong> em Clojure. N\u00e3o tanto para criar aplica\u00e7\u00f5es concorrentes, mas sim para implementar DSL&#8217;s para alguns de meus projetos. Tenho obtido muito sucesso nesta tarefa. Al\u00e9m disto, tamb\u00e9m tem sido um aprendizado maravilhoso: acredito que t\u00e9cnicamente eu tenha dado um pulo qu\u00e2ntico. \u00c9 um bom neg\u00f3cio aprender Clojure mesmo que voc\u00ea jamais o use, pois abre sua mente para outro estilo de programa\u00e7\u00e3o.<\/p>\n<p>O crescimento real s\u00f3 v\u00eam quando estamos fora da zona de conforto. Com certeza estou fora da minha. E este post \u00e9 apenas o primeiro de uma s\u00e9rie que, no futuro, formar\u00e1 um &#8220;Clojure, um guia r\u00e1pido e indireto&#8221;. Espero que voc\u00eas gostem. :)<\/p>\n<p>PS aos Groovyanos: observe as semelhan\u00e7as entre Groovy e Lisp.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Clojure \u00e9 um t\u00f3pico que tem ocupado boa parte do meu tempo nos \u00faltimos meses. \u00c9 a realiza\u00e7\u00e3o de um sonho antigo: ver uma variante do Lisp emplacando no ambiente corporativo. Isto porqu\u00ea a linguagem \u00e9 feita para ser executada dentro de uma m\u00e1quina virtual. Atualmente, h\u00e1 implementa\u00e7\u00f5es da linguagem tanto para a JVM quanto [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[58,22],"tags":[],"class_list":["post-789","post","type-post","status-publish","format-standard","hentry","category-clojure","category-lisp"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Primeiros passos com Clojure - Iniciando com o p\u00e9 direito - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=789\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Primeiros passos com Clojure - Iniciando com o p\u00e9 direito - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Clojure \u00e9 um t\u00f3pico que tem ocupado boa parte do meu tempo nos \u00faltimos meses. \u00c9 a realiza\u00e7\u00e3o de um sonho antigo: ver uma variante do Lisp emplacando no ambiente corporativo. Isto porqu\u00ea a linguagem \u00e9 feita para ser executada dentro de uma m\u00e1quina virtual. Atualmente, h\u00e1 implementa\u00e7\u00f5es da linguagem tanto para a JVM quanto [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=789\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2010-09-12T00:19:37+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2010-09-12T15:44:34+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2010\/07\/clojure-icon.gif\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=789\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=789\",\"name\":\"Primeiros passos com Clojure - Iniciando com o p\u00e9 direito - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=789#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=789#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/07\/clojure-icon.gif\",\"datePublished\":\"2010-09-12T00:19:37+00:00\",\"dateModified\":\"2010-09-12T15:44:34+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=789#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=789\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=789#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/07\/clojure-icon.gif\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/07\/clojure-icon.gif\",\"width\":\"100\",\"height\":\"100\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=789#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Primeiros passos com Clojure &#8211; Iniciando com o p\u00e9 direito\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Primeiros passos com Clojure - Iniciando com o p\u00e9 direito - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=789","og_locale":"pt_BR","og_type":"article","og_title":"Primeiros passos com Clojure - Iniciando com o p\u00e9 direito - \/dev\/Kico","og_description":"Clojure \u00e9 um t\u00f3pico que tem ocupado boa parte do meu tempo nos \u00faltimos meses. \u00c9 a realiza\u00e7\u00e3o de um sonho antigo: ver uma variante do Lisp emplacando no ambiente corporativo. Isto porqu\u00ea a linguagem \u00e9 feita para ser executada dentro de uma m\u00e1quina virtual. Atualmente, h\u00e1 implementa\u00e7\u00f5es da linguagem tanto para a JVM quanto [&hellip;]","og_url":"https:\/\/devkico.itexto.com.br\/?p=789","og_site_name":"\/dev\/Kico","article_published_time":"2010-09-12T00:19:37+00:00","article_modified_time":"2010-09-12T15:44:34+00:00","og_image":[{"url":"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2010\/07\/clojure-icon.gif"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=789","url":"https:\/\/devkico.itexto.com.br\/?p=789","name":"Primeiros passos com Clojure - Iniciando com o p\u00e9 direito - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=789#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=789#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/07\/clojure-icon.gif","datePublished":"2010-09-12T00:19:37+00:00","dateModified":"2010-09-12T15:44:34+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=789#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=789"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=789#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/07\/clojure-icon.gif","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/07\/clojure-icon.gif","width":"100","height":"100"},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=789#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Primeiros passos com Clojure &#8211; Iniciando com o p\u00e9 direito"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/789"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=789"}],"version-history":[{"count":14,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/789\/revisions"}],"predecessor-version":[{"id":803,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/789\/revisions\/803"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=789"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=789"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=789"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}