<story><title>Six Years of Professional Clojure</title><url>https://engineering.nanit.com/6-years-of-professional-clojure-2b61cb6c1983</url></story><parent_chain></parent_chain><comment><author>dgb23</author><text>I found one of the perceived weaknesses of Clojure (in this article), it being dynamically typed, is a tradeoff rather than a pure negative. But it applies that tradeoff differently than dynamic languages I know otherwise and that difference is qualitative: It enables a truly interactive way of development that keeps your mind in the code, while it is running. This is why people get addicted to Lisp, Smalltalk and similar languages.&lt;p&gt;&amp;gt; To understand a program you must become both the machine and the program.&lt;p&gt;- Epigrams in Programming, Alan Perlis&lt;p&gt;Two of the big advantages of (gradually-) typed languages are communication (documentation) and robustness. These can be gained back with clojure spec and other fantastic libraries like schema and malli. What you get here goes way beyond what a strict, static type systems gets you, such as arbitrary predicate validation, freely composable schemas, automated instrumentation and property testing. You simply do not have that in a static world. These are old ideas and I think one of the most notable ones would be Eiffel with it&amp;#x27;s Design by Contract method, where you communicate pre-&amp;#x2F;post-conditions and invariants clearly. It speaks to the power of Clojure (and Lisp in general) that those are just libraries, not external tools or compiler extensions.</text></comment>
<story><title>Six Years of Professional Clojure</title><url>https://engineering.nanit.com/6-years-of-professional-clojure-2b61cb6c1983</url></story><parent_chain></parent_chain><comment><author>dmitriid</author><text>One thing I don&amp;#x27;t like about all articles on clojure is that basically all of them say: ah, it&amp;#x27;s just like lisp with lists `(an (example of) (a list))` with vectors `[1 2 3]` thrown in. So easy!&lt;p&gt;But then you get to Clojure proper, and you run into additional syntax that either convention or functions&amp;#x2F;macros that look like additional syntax.&lt;p&gt;Ok, granted, -&amp;gt; and -&amp;gt;&amp;gt; are easy to reason about (though they look like additional syntax).&lt;p&gt;But then there&amp;#x27;s entirely ungooglable ^ that I see in code from time to time. Or the convention (?) that call methods on Java code (?) with a `.-`&lt;p&gt;Or atoms defined with @ and dereferenced with *&lt;p&gt;Or the { :key value } structure&lt;p&gt;There&amp;#x27;s way more syntax (or things that can be perceived as syntax, especially to beginners) in Clojure than the articles pretend there is.&lt;p&gt;&lt;pre&gt;&lt;code&gt;    (defn ^:export db_with [db entities]
      (d&amp;#x2F;db-with db (entities-&amp;gt;clj entities)))

    (defn entity-db
      &amp;quot;Returns a db that entity was created from.&amp;quot;
      [^Entity entity]
      {:pre [(de&amp;#x2F;entity? entity)]}
      (.-db entity))

    (defn ^:after-load ^:export refresh []
      (let [mount (js&amp;#x2F;document.querySelector &amp;quot;.mount&amp;quot;)
            comp  (if (editor.debug&amp;#x2F;debug?)
                    (editor.debug&amp;#x2F;ui editor)
                    (do
                      (when (nil? @*post)
                        (reset! *post (-&amp;gt; (.getAttribute mount &amp;quot;data&amp;quot;) (edn&amp;#x2F;read-string))))
                      (editor *post)))]
        (rum&amp;#x2F;mount comp mount)))&lt;/code&gt;&lt;/pre&gt;</text></comment>