[HN Gopher] ClojureScript 1.10.866 Release
       ___________________________________________________________________
        
       ClojureScript 1.10.866 Release
        
       Author : tosh
       Score  : 121 points
       Date   : 2021-05-25 14:46 UTC (8 hours ago)
        
 (HTM) web link (clojurescript.org)
 (TXT) w3m dump (clojurescript.org)
        
       | truth_seeker wrote:
       | I haven't used clojure/clojurescript since more than 3-4 years.
       | How far the performance of CLJS [:optimization :advanced] has
       | come close to writing core js code ?
       | 
       | I still remember good old memories of using CLJS (around
       | 2017-18), we were rewriting the android app for one of our
       | clients ethanol selling company in Africa/kenya (which took
       | roughly more than 6 months to write, test and deliver, still was
       | crappy) in cordova/phonegap hybrid mobile app using CLJS, reagent
       | and materialize.css. We did it in only 2 and half weeks with
       | extensive test coverage. In my team only i knew clojure and
       | played little bit with cljs and reagent while creating a to-do
       | list app.
       | 
       | We never used to test the app after creating an android build, we
       | were relying all the time chrome dev tools by hosting it as SPA
       | app, writing test cases and fixing css & functionality issues if
       | any. We were so confident that it will work as expected after
       | exporting to .apk after simple codova/phonegap build process.
       | More than 95% of the time, it always did.
       | 
       | I had to teach my other 2 teammates the basics of cljs and whole
       | project development handling. It was the most challenging as well
       | as productive 2 and half weeks of entire career. I never could
       | imagine we could it develop it so fast with completely new
       | language onboard. I had to play many tricks to allure my upper
       | management to invest in a lisp dialect. I promised them to
       | rewrite in under 6 weeks and ship to production. From 6 weeks
       | commitment to 2 and half, we were on cloud 9. We also worked on
       | weekends almost full time during that release.
       | 
       | Unfortunately due to some restrictions of supporting older
       | android versions than 4.4 in kenya region we had to abandon the
       | idea of hybrid app using cordova/phonegap after 3 months as more
       | clients demanded.
        
         | raspasov wrote:
         | I don't have exact numbers but I recall some stats from years
         | ago where it was 10-30% slower.
         | 
         | TLDR Almost identical performance.
        
           | slver wrote:
           | Why is a script compiled to another script up to 30% slower
           | than its target?
        
             | dustingetz wrote:
             | Clojure's immutable/lazy sequence abstraction involves some
             | closures, it does not compile directly to e.g. array
             | looping. I believe the JS VM also is tuned for imperative
             | programming. I'm not sure how much it matters given most
             | people are paying for a virtual dom & diffing, over
             | querying, over-rendering, etc.
        
             | raspasov wrote:
             | As with all benchmarks, a lot of caveats apply.
             | ClojureScript gives you a lot of power, and a lot of tools
             | to easily reason about your code in many asynchronous
             | scenarios. I believe that you if you wrote JavaScript that
             | gives you the same amount of power and immutability
             | guarantees that ClojureScript provides, it will also be
             | slower than a simplistic benchmark that mutates everything
             | all over the place.
        
             | capableweb wrote:
             | Everything is something compiled to something else and
             | eventually machine code, but some do run faster/slower than
             | others.
             | 
             | Usually it's mostly about that generated code is more
             | bloated to manually crafted code. Compare generated
             | assembly with manually crafted assembly and you'll see what
             | I mean.
        
               | slver wrote:
               | The irony is that for modern processors, generated
               | assembly tends to be faster, because the required
               | optimization is so specific, manually crafting it can
               | almost never match an optimizing compiler.
               | 
               | But I get the spirit of what you said.
        
               | capableweb wrote:
               | > The irony is that for modern processors, generated
               | assembly tends to be faster, because the required
               | optimization is so specific, manually crafting it can
               | almost never match an optimizing compiler.
               | 
               | That's interesting, haven't heard of that before. You
               | happen to know of any comparisons that show the
               | difference? Or some other resource on the subject.
               | 
               | > But I get the spirit of what you said.
               | 
               | Thanks for not being overtly anal about it, which tends
               | to be the norm :)
        
       | dmitriid wrote:
       | How is Google's Closure Compiler these days?
       | 
       | The last time I tried CLojurescript about 5 years ago it was the
       | source of many a cryptic error, non-existent documentation, and
       | no connection to any of the Javascript outside of Google-flavor
       | javascript (such as not understanding either `require` or the
       | then-new `import`s)
       | 
       | It looks like the documentation is as non-existent today, but it
       | would be interesting to know how it fares in modern world.
        
       | nickik wrote:
       | As Clojure programmer since Clojure 1.1 I am so impressed with
       | ClojureScript. I never had much use for ClojureScript but I
       | always follow what going on. swannodette is the peak language
       | maintenancer and helped push the initial idea further then I
       | thought possible.
       | 
       | I remember the original talk by Rick and so much work was left.
       | Congrats to the team.
       | 
       | P.S: Is there a real good ClojureScript library to work with maps
       | and map data? Or a demo of how to do that kind of thing?
        
         | kccqzy wrote:
         | But swannodette also produced om, which became abandonware,
         | which became a lot of headache for a company I used to work at.
         | At least we didn't eagerly adopt om.next.
        
           | diggan wrote:
           | > which became abandonware
           | 
           | I always understood abandonware to be commercial software
           | that no longer is supported by the company who created it. I
           | have a feeling open source can't be abandonware, as support
           | was never guaranteed in the first place. Maybe a nicer way to
           | put it is that Om was "completed" :)
        
             | kccqzy wrote:
             | Well om might indeed be complete, but it in fact requires
             | React under the hood, and there's always some work needed
             | to get the completed om to work with new React releases.
        
             | swannodette wrote:
             | To be fair there were definitely still bugs in Om as well
             | as om.next (and both were marked as being experimental and
             | of alpha quality) - however Fulcro came along and more less
             | took the ideas and took them further and far as I know is
             | actively maintained. I don't use it - but I suspect there
             | was/is probably some kind of migration path.
        
         | diggan wrote:
         | > P.S: Is there a real good ClojureScript library to work with
         | maps and map data? Or a demo of how to do that kind of thing?
         | 
         | It's a bit ambiguous what you're asking for. I'm guessing
         | you're asking for geographic maps data, and not maps as in
         | Clojure Maps
         | (https://clojure.org/guides/learn/hashed_colls#_maps)?
        
         | heyzk wrote:
         | If you're looking to embed maps in a web page I've had good
         | experiences with using both Mapbox and Google Maps' js
         | libraries directly from cljs. On the geospatial side JSTS
         | (https://github.com/bjornharrtell/jsts) has been super helpful.
         | 
         | Like you, I was looking for a cljs wrapper for these things,
         | but ended up not needing them in the end. The js interop ended
         | up being pretty straightforward.
         | 
         | Happy to chat further, email in bio.
        
       | tanaypingalkar wrote:
       | (I just don't understand this bracket)
        
       | swannodette wrote:
       | Mostly a maintenance release, but the and/or compiler pass thing
       | is somewhat neat. First, it might seem that such an optimization
       | would not be that useful, but actually it's one of the most
       | critical ones - we want to write the persistent data structure
       | code in a language idiomatic way yet know that performance
       | sensitive JavaScript code will be generated.
       | 
       | Here's the problem.
       | 
       | In Clojure `and` and `or` are just macros that expand to `let` +
       | `if`, simple and elegant:                   (defmacro and
       | ([] true)           ([x] x)           ([x & next]
       | `(let [and# ~x]               (if and# (and ~@next) and#))))
       | 
       | ... except when you target JavaScript - which is not an
       | expression oriented language. So `let` will be wrapped in an
       | immediately invoked function expression (IIFE). Google Closure
       | does elide these when it can, but it will give up after only a
       | few levels of nesting. For an IIFE to appear in the middle of a
       | conditional is a performance killer.
       | 
       | Another complication is that it's not safe to just use `&&` and
       | `||` blindly because of `0` and the empty string and the other
       | cases which are not false-y in Clojure(Script). Checks for
       | JavaScript false-y values are a performance killer.
       | 
       | So years ago we implemented a simple form of type inference which
       | annotates the AST with type information as a compiler pass on
       | every node when possible. As long we know the JavaScript `if`
       | will receive a boolean value we can elide the JS false-y value
       | check.
       | 
       | But this is also exactly the information we need to safely run a
       | following pass that looks for the above and/or syntactical
       | patterns and optimize it. As long as each nested `if` is
       | guaranteed to return a boolean, we can remove the local and use
       | `&&` or `||` instead.
       | 
       | The and/or optimization pass ended up being ~120 lines of code
       | with no actual dependencies on anything else in the ClojureScript
       | analyzer or compiler because the ClojureScript AST is just plain
       | EDN -
       | https://github.com/clojure/clojurescript/blob/master/src/mai...
       | 
       | Happy to answer any further questions about this!
       | 
       | UPDATE: Also ClojureScript turned 10 years old this month :)
        
         | lukashrb wrote:
         | Thank you and all contributern for your amazing work on
         | clojurescript.
        
       | andrenth wrote:
       | I wonder if there's any interest from the ClojureScript community
       | in pairing it with Deno for an easy-to-deploy Clojure
       | alternative.
        
         | diggan wrote:
         | Guess I'm a part of the ClojureScript community, what exactly
         | would Deno bring me? Seems Deno is just NodeJS + TypeScript so
         | little to gain there. Dependency management is even worse in
         | Deno than NodeJS as well, something I didn't think I'd see in
         | my lifetime. It hardly gets easier than deploying JAR files
         | either, even for someone like me with 0% Java experience.
        
           | andrenth wrote:
           | Well, you'd get single binary deployment with no other
           | requirements on the server using deno compile [1]. I
           | understand there is an alternative for that with GraalVM, but
           | Deno feels more lightweight.
           | 
           | [1] https://deno.land/manual/tools/compiler
        
             | diggan wrote:
             | > no other requirements on the server
             | 
             | Seems not quite right, the binary does have some
             | dependencies at least. It's no Java, I give you that.
             | $ deno compile https://deno.land/std/examples/welcome.ts
             | Check https://deno.land/std/examples/welcome.ts
             | Bundle https://deno.land/std/examples/welcome.ts
             | Compile https://deno.land/std/examples/welcome.ts
             | Emit welcome                  $ ldd welcome          linux-
             | vdso.so.1 (0x00007ffefc6de000)          libdl.so.2 =>
             | /usr/lib/libdl.so.2 (0x00007fc154c63000)
             | libgcc_s.so.1 => /usr/lib/libgcc_s.so.1
             | (0x00007fc154c48000)          librt.so.1 =>
             | /usr/lib/librt.so.1 (0x00007fc154c3d000)
             | libpthread.so.0 => /usr/lib/libpthread.so.0
             | (0x00007fc154c1c000)          libm.so.6 =>
             | /usr/lib/libm.so.6 (0x00007fc154ad8000)          libc.so.6
             | => /usr/lib/libc.so.6 (0x00007fc15490c000)
             | /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-
             | linux-x86-64.so.2 (0x00007fc1586b2000)
             | 
             | The question is, is it worth using Deno just because it can
             | produce binaries? For me, it's not. If I want that I'd go
             | for Golang or Rust, but in general I just want it to be
             | simple to program and maintain, so I always go for Clojure
             | and ClojureScript as both are miles ahead any other
             | programming language I've tried. TypeScript would probably
             | be in the bottom of languages to use :)
        
       | benjaminjackman wrote:
       | Random question: Can ClojureScript be compiled in the browser? I
       | only looked at it when it first came out and at that time the
       | ClojureScript compiler only ran via the JVM.
        
         | lmilcin wrote:
         | When I work on ClojureScript app I am actually modifying
         | application that is running in the browser, without ever
         | reloading the page. That would not be possible if it could not
         | compile or at least interpret it in the browser.
        
           | kccqzy wrote:
           | Hot reload doesn't imply compilation in the browser. For all
           | you know lein could be recompiling via the JVM and sending
           | updated JS files to the browser.
        
           | benjaminjackman wrote:
           | That sounds pretty cool, is there a guide to setting that up?
        
             | lmilcin wrote:
             | Sure. I use fighwheel. https://figwheel.org/
             | 
             | Actually, when I develop with clojure, I typically have
             | both backend and frontend running at the same time and I am
             | concurrently modifying both applications without restarting
             | them. This is way, way more convenient than having to
             | restart application and then to bring it to a state to run
             | your test.
             | 
             | This is youtube video from which I learned about fighwheel:
             | https://www.youtube.com/watch?v=j-kj2qwJa_E
             | 
             | Have fun!
        
         | chrisoakman wrote:
         | ClojureScript is self-hosted and thus can be compiled in a
         | browser (see https://clojurescript.io/ for an example).
         | 
         | For most serious usage and projects you will want to use the
         | JVM though.
        
         | kolme wrote:
         | Yes, with caveats: https://clojurescript.org/guides/self-
         | hosting
        
         | diggan wrote:
         | I think ClojureScript has been able to compile itself since
         | ~2015 if I remember correctly. There is some helper libraries
         | that makes the experience nicer nowadays too, tools like KLIPSE
         | (https://github.com/viebel/klipse)
         | 
         | Here are some starting points:
         | 
         | - https://clojurescript.org/guides/self-hosting
         | 
         | -
         | https://practicalli.github.io/clojurescript/quickstart/self-...
         | 
         | - https://blog.klipse.tech/clojurescript/2016/04/04/self-
         | host-...
        
         | [deleted]
        
         | escherize wrote:
         | There is a new thing, and it's kind of a toy [0]. But it lets
         | you load clojurescript from a script tag, so there is
         | practically no setup needed!!
         | 
         | [0] - https://borkdude.github.io/sci-script-tag/index.html
        
           | diggan wrote:
           | Worth keeping in mind that that's Small Clojure Interpreter
           | (SCI) which while very cool, isn't ClojureScript. Seems to be
           | running Reagent perfectly fine though, so not sure what the
           | exact differences are, AFAIK, SCI is a subset of Clojure.
        
         | divs1210 wrote:
         | Yes.
         | 
         | ClojureScript is self-hosting, and there are helper tools out
         | there like klipse that make it easier to set up.
         | 
         | A more lightweight option is borkdude's SCI (Small Clojure
         | Interpreter) running inside HTML script tags:
         | 
         | https://github.com/borkdude/sci-script-tag
        
       ___________________________________________________________________
       (page generated 2021-05-25 23:01 UTC)