> Why not Racket or Common Lisp etc?
These already have solutions in the compilation space.
Kyoto Common Lisp (KCL), a fairly old implementation tracing back to the 1980's, and its descendant GNU Common Lisp (GCL) compile to C.
Embeddable Common Lisp (ECL) also contains a Lisp to C compiler.
Of course, numerous CL implementations compile to native code without the C route.
Other Lisp-to-C compilers like CLICC, mocl, Thinlisp, and a few others are not descendants of KCL.
Boy, the implementors made a significant mistake in this one. Though CLICC is not intended to be a complete Lisp system, but a Lisp application, they insisted that CLICC has to itself be a CLICC-compiled application. And so what that means is that, then, programs being compiled with this bootstrapped CLICC are severely limited as to what they can do at compile time (in macros), simply because of the crippled run-time environment of the CLICC-compiled CLICC compiler which has to run without the benefit of an actual CL runtime. Whereas if CLICC had been kept as a Lisp-compiled program, only the run-time parts of user code would be restricted to the "CL1" language; macros could be written in full CL.
So the whole data structure isn't copied but only the relevant parts are added / updated in the tree and the rest is shared with the "new" data structure.
Mutable data structures are still more memory effective but I'm assuming its fine since the author has a blog post on using ferret on an Arduino Uno which has 32k of ram. https://nakkaya.com/2017/02/15/bare-metal-lisp-rc-control-us...
Clojure data Sturucture links: Persistent Vectors http://hypirion.com/musings/understanding-persistent-vector-...
Video with Rick hick on them https://youtu.be/wASCH_gPnDw?t=1742
Any of those tiny environments run circles around the hardware constraints of 60's and 70's mainframes.
For me, I like being able to take EDN and immutable data to the various platforms I need. My portability hurdle is little more than writing alternative functions where Java/JS interop doesn't port.
(defn foo [arg1 arg2 & rest] ...)
As for data-structure literals, it's nice to be able to write [1 2 3] vs (vec '(1 2 3))
{:key1 "val1", :key2 "val2"} vs (hash-map :key1 "val1" :key2 "val2")
Agreed, all pretty minor points, but all nice to have. Function arguments are easily distinguishable and creating maps/vectors is simplified.