{"id":2207,"date":"2014-05-31T03:30:24","date_gmt":"2014-05-31T08:30:24","guid":{"rendered":"http:\/\/www.patheos.com\/blogs\/crywoof\/?p=2207"},"modified":"2014-05-30T18:30:45","modified_gmt":"2014-05-30T23:30:45","slug":"coming-to-a-clojure","status":"publish","type":"post","link":"https:\/\/www.patheos.com\/blogs\/crywoof\/2014\/05\/coming-to-a-clojure\/","title":{"rendered":"Coming to a Clojure"},"content":{"rendered":"<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/REC-html40\/loose.dtd\">\n<html><head><meta http-equiv=\"content-type\" content=\"text\/html; charset=utf-8\"><meta http-equiv=\"content-type\" content=\"text\/html; charset=utf-8\"><\/head><body><p><a href=\"https:\/\/wp-media.patheos.com\/blogs\/sites\/384\/2014\/05\/clojure.png\" class=\" decorated-link\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/wp-media.patheos.com\/blogs\/sites\/384\/2014\/05\/clojure-300x300.png\" alt=\"\" title=\"clojure\" width=\"300\" height=\"300\" class=\"alignright size-medium wp-image-2210\"><\/a> I\u2019m a software engineer at my day job, and I\u2019m a long-time programming language junkie.  Every so often I find that I need to spend time learning a new programming language, just to keep my brain working freely.  Just recently I\u2019ve been experimenting with a language called <a href=\"http:\/\/clojure.org\" class=\" decorated-link\" target=\"_blank\" rel=\"nofollow\">Clojure<\/a>.<\/p>\n<p>Fair warning: the remainder of this post is going to be mondo geeky.<\/p>\n<p>Clojure is yet another variant of LISP, which is itself one of the oldest computer languages in the world.  I\u2019ve never written any production code in LISP, but every five or ten years I come back to it, see what\u2019s going on, and have my brain stretched.  There are things that are easily done in LISP that are impossible in most languages, and it\u2019s always fun to learn more about them, and get ideas to take back to my regular work.<\/p>\n<p>The problem with LISP is that historically it hasn\u2019t played nicely with others.  LISP usually wants to be the entire programming environment: you do all of your work in LISP, and interact with the operating system only through LISP\u2019s platform abstractions, which (in the case of Common LISP) are often old and out of step with the rest of the programming world.  Moreover, even Common LISP hasn\u2019t always been cross-platform\u2014every LISP system is a little bit different.  In my day job, I\u2019ve never been in a position to consider using only LISP for a project; and these days I\u2019m not going to do any serious application development at home unless the result project is cross-platform.  Thus, although I\u2019ve enjoyed playing with LISP from time to time, I haven\u2019t made a serious effort to write a full application in it since the mid-1980\u2019s.<\/p>\n<p>The author of Clojure, on the other hand, explicitly trys to make it play well with others. Clojure is a LISP, but it\u2019s an unusual LISP.  Rich Hickey has simplified the language in some ways, and extended it in others, and the result is a heck of a lot easier to get your head around than the behemoth that is Common Lisp.  It targets the Java JVM: it can seamlessly make use of libraries written in Java, and you can write libraries in Clojure to be used by Java code.  All of the standard facilities available to Java code are available to Clojure, right down to the Swing GUI libraries: you can write GUI applications in Clojure just as you would in Java.  And the number of third-party libraries available to Java coders is massive; it\u2019s an enormous community, and the Clojure world gets to take advantage of that.<\/p>\n<p>And not only is Clojure a LISP-like language, with all of the neat toys that that implies, not only can it seamlessly work with Java code\u2014not only that, it\u2019s actually gaining some traction with real working programmers.  There\u2019s always been a lunatic fringe (a scary-smart lunatic fringe, mind you) devoted to LISP, but this is the first time since the late \u201980\u2019s that I\u2019ve seen any movement to use LISP by the wider programming community.  And that\u2019s very cool.<\/p>\n<p>So I\u2019m learning Clojure.<\/p>\n<p>So, then\u2014if you want to learn a language like Clojure, how do you get started?  As I\u2019ve always said, it helps to have the right tools; and since I\u2019ve spent a couple of weeks figuring out what they are, I\u2019ll share that with you in another post.<\/p>\n<\/body><\/html>\n","protected":false},"excerpt":{"rendered":"<p>I\u2019m a software engineer at my day job, and I\u2019m a long-time programming language junkie. Every so often I find that I need to spend time learning a new programming language, just to keep my brain working freely. Just recently I\u2019ve been experimenting with a language called Clojure. Fair warning: the remainder of this post [&hellip;]<\/p>\n","protected":false},"author":1131,"featured_media":2210,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[74],"tags":[427],"class_list":["post-2207","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-woof-guide-to-technology","tag-clojure"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Coming to a Clojure<\/title>\n<meta name=\"description\" content=\"I&#039;m a software engineer at my day job, and I&#039;m a long-time programming language junkie. Every so often I find that I need to spend time learning a new\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.patheos.com\/blogs\/crywoof\/2014\/05\/coming-to-a-clojure\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Coming to a Clojure\" \/>\n<meta property=\"og:description\" content=\"I&#039;m a software engineer at my day job, and I&#039;m a long-time programming language junkie. Every so often I find that I need to spend time learning a new\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.patheos.com\/blogs\/crywoof\/2014\/05\/coming-to-a-clojure\/\" \/>\n<meta property=\"og:site_name\" content=\"Cry &#039;Woof&#039;\" \/>\n<meta property=\"article:published_time\" content=\"2014-05-31T08:30:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2014-05-30T23:30:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wp-media.patheos.com\/blogs\/sites\/384\/2014\/05\/clojure.png\" \/>\n\t<meta property=\"og:image:width\" content=\"500\" \/>\n\t<meta property=\"og:image:height\" content=\"500\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"willduquette\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"willduquette\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.patheos.com\/blogs\/crywoof\/2014\/05\/coming-to-a-clojure\/\",\"url\":\"https:\/\/www.patheos.com\/blogs\/crywoof\/2014\/05\/coming-to-a-clojure\/\",\"name\":\"Coming to a Clojure\",\"isPartOf\":{\"@id\":\"https:\/\/www.patheos.com\/blogs\/crywoof\/#website\"},\"datePublished\":\"2014-05-31T08:30:24+00:00\",\"dateModified\":\"2014-05-30T23:30:45+00:00\",\"author\":{\"@id\":\"https:\/\/www.patheos.com\/blogs\/crywoof\/#\/schema\/person\/ff6351804d01f835d127aa686467fa2c\"},\"description\":\"I'm a software engineer at my day job, and I'm a long-time programming language junkie. Every so often I find that I need to spend time learning a new\",\"breadcrumb\":{\"@id\":\"https:\/\/www.patheos.com\/blogs\/crywoof\/2014\/05\/coming-to-a-clojure\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.patheos.com\/blogs\/crywoof\/2014\/05\/coming-to-a-clojure\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.patheos.com\/blogs\/crywoof\/2014\/05\/coming-to-a-clojure\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.patheos.com\/blogs\/crywoof\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Coming to a Clojure\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.patheos.com\/blogs\/crywoof\/#website\",\"url\":\"https:\/\/www.patheos.com\/blogs\/crywoof\/\",\"name\":\"Cry &#039;Woof&#039;\",\"description\":\"And let slip the dogs of whimsy!\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.patheos.com\/blogs\/crywoof\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.patheos.com\/blogs\/crywoof\/#\/schema\/person\/ff6351804d01f835d127aa686467fa2c\",\"name\":\"willduquette\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.patheos.com\/blogs\/crywoof\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8075b1526bb772efdba031f0e814158b?s=96&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8075b1526bb772efdba031f0e814158b?s=96&r=g\",\"caption\":\"willduquette\"},\"url\":\"https:\/\/www.patheos.com\/blogs\/crywoof\/author\/willduquette\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Coming to a Clojure","description":"I'm a software engineer at my day job, and I'm a long-time programming language junkie. Every so often I find that I need to spend time learning a new","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:\/\/www.patheos.com\/blogs\/crywoof\/2014\/05\/coming-to-a-clojure\/","og_locale":"en_US","og_type":"article","og_title":"Coming to a Clojure","og_description":"I'm a software engineer at my day job, and I'm a long-time programming language junkie. Every so often I find that I need to spend time learning a new","og_url":"https:\/\/www.patheos.com\/blogs\/crywoof\/2014\/05\/coming-to-a-clojure\/","og_site_name":"Cry &#039;Woof&#039;","article_published_time":"2014-05-31T08:30:24+00:00","article_modified_time":"2014-05-30T23:30:45+00:00","og_image":[{"width":"500","height":"500","url":"https:\/\/wp-media.patheos.com\/blogs\/sites\/384\/2014\/05\/clojure.png","type":"image\/png"}],"author":"willduquette","twitter_card":"summary_large_image","twitter_misc":{"Written by":"willduquette","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.patheos.com\/blogs\/crywoof\/2014\/05\/coming-to-a-clojure\/","url":"https:\/\/www.patheos.com\/blogs\/crywoof\/2014\/05\/coming-to-a-clojure\/","name":"Coming to a Clojure","isPartOf":{"@id":"https:\/\/www.patheos.com\/blogs\/crywoof\/#website"},"datePublished":"2014-05-31T08:30:24+00:00","dateModified":"2014-05-30T23:30:45+00:00","author":{"@id":"https:\/\/www.patheos.com\/blogs\/crywoof\/#\/schema\/person\/ff6351804d01f835d127aa686467fa2c"},"description":"I'm a software engineer at my day job, and I'm a long-time programming language junkie. Every so often I find that I need to spend time learning a new","breadcrumb":{"@id":"https:\/\/www.patheos.com\/blogs\/crywoof\/2014\/05\/coming-to-a-clojure\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.patheos.com\/blogs\/crywoof\/2014\/05\/coming-to-a-clojure\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.patheos.com\/blogs\/crywoof\/2014\/05\/coming-to-a-clojure\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.patheos.com\/blogs\/crywoof\/"},{"@type":"ListItem","position":2,"name":"Coming to a Clojure"}]},{"@type":"WebSite","@id":"https:\/\/www.patheos.com\/blogs\/crywoof\/#website","url":"https:\/\/www.patheos.com\/blogs\/crywoof\/","name":"Cry &#039;Woof&#039;","description":"And let slip the dogs of whimsy!","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.patheos.com\/blogs\/crywoof\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.patheos.com\/blogs\/crywoof\/#\/schema\/person\/ff6351804d01f835d127aa686467fa2c","name":"willduquette","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.patheos.com\/blogs\/crywoof\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8075b1526bb772efdba031f0e814158b?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8075b1526bb772efdba031f0e814158b?s=96&r=g","caption":"willduquette"},"url":"https:\/\/www.patheos.com\/blogs\/crywoof\/author\/willduquette\/"}]}},"_links":{"self":[{"href":"https:\/\/www.patheos.com\/blogs\/crywoof\/wp-json\/wp\/v2\/posts\/2207","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.patheos.com\/blogs\/crywoof\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.patheos.com\/blogs\/crywoof\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.patheos.com\/blogs\/crywoof\/wp-json\/wp\/v2\/users\/1131"}],"replies":[{"embeddable":true,"href":"https:\/\/www.patheos.com\/blogs\/crywoof\/wp-json\/wp\/v2\/comments?post=2207"}],"version-history":[{"count":0,"href":"https:\/\/www.patheos.com\/blogs\/crywoof\/wp-json\/wp\/v2\/posts\/2207\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.patheos.com\/blogs\/crywoof\/wp-json\/wp\/v2\/media\/2210"}],"wp:attachment":[{"href":"https:\/\/www.patheos.com\/blogs\/crywoof\/wp-json\/wp\/v2\/media?parent=2207"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.patheos.com\/blogs\/crywoof\/wp-json\/wp\/v2\/categories?post=2207"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.patheos.com\/blogs\/crywoof\/wp-json\/wp\/v2\/tags?post=2207"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}