I think we are still just babies in the history of programming. 50 years is nothing.
We don't have top-level terms that cover Java, C# and Kotlin, or TypeScript and JS, or C/Objective-C/C++.
int main() { }
\begin{document}
cp ${srcdir}/x ${tgtdir}/y
.foo p { border: 0px; }
/m { newpath moveto } def2) JavaScript family languages
3) C family languages
It sounds like the Discordian battle cry: united we fall, divided we stand!
One Lisp to rule them all, One Lisp to find them, One Lisp to bring them all, and in the darkness bind them.
Tcl/Tk is still an unrivalled way to prototype a GUI -- and with Snit megawidgets, it's almost like programming a modern JavaScript component framework like React.
Completely agree about the utility of Tk. I remember reading somewhere that HTML/CSS widgets were influenced by Tk. Don't know how true that is but I can see how it could be.
(I actually tried to retrofit some of CL in Tcl, heh; https://wiki.tcl-lang.org/page/q3cpma)
Lately, I'm going back to what I used years ago: Common Lisp. There are great books describing it, and implementations like SBCL https://www.sbcl.org/ are solid.
p.s. Plenty of time to come with the lisp for the 22nd century!
I got pretty into Chicken Scheme a few years ago, and I did a quick breakout clone in Racket as well, and I think they're pretty cool, but Clojure is the only one that has ever evolved past "toy" for me.
Do you ever need it?
The Apache tools are the biggest things for me; I do a lot of work with Apache Kafka, so being able to directly use the first-party libraries like Kafka Streams is useful. If I need to do any kind of distributed processing stuff, I have Apache Spark or Apache Flink when I need it. It's kind of falling out of favor now, but I still occasionally have a need for Apache Zookeeper as well.
Now, I'm sure that there's Clojure-first versions of these things, but the sad truth of the software landscape for me is that a lot of it is still powered by Java. I can either be tasked with reinventing a lot of the infrastructure myself by using a language that doesn't have good Java interop, or I can use a JVM language. I think that Clojure is the least-bad of the latter category.
In some ways, Clojure is an even better Java than Java; it's easy to compose together arbitrary java methods, without any kind of fancy fluent interface or anything, for example, and there's lots of helper macros that I think really do smooth over the Java-ness of certain interfaces.
I bring this up, because I am curious which “Clojurisms” annoy you? I probably didn’t notice them because I wasn’t used to other lisps when learning it.
A lot of Clojure people might be like "I don't see anything wrong with it, in fact I prefer things the Clojure way." Whatever. You do you, man. I just can't with that. Kawa Scheme for me every time if I want to Lisp with Java libraries. Second place, ABCL.
The discussion about parenthesis is a bit ridiculous, but unfortunely their visual distribution does matter, and Clojure is more appealing to folks without Lisp/Scheme background.
thanks for explaining.
If my goal were as simple "read and write and commit to Kafka", the vanilla clients like rdkafka would be fine. However, most of my personal projects for the last year have made pretty liberal use of the Kafka Streams library, which as far as I'm aware only exists in JVM land.
We've used it and it worked well.
Newlisp's default (and most used) FFI is also... dangerous. You simply import a symbol from a shared lib and it gets bound to a procedure corresponding to a C call to that shared lib. No specifying of parameter types -- and most platforms do not encode parameter type information in shared libraries in a standard universal way. (Things like C++ name mangling, and COM, only apply to libraries written within their respective ecosystems.) But don't worry. Newlisp trusts you to get the parameter types right, because Newlisp is for the practical Lisp programmer. Woe betide you if you don't, though!
Guile's (system foreign) module provides a similarly dangerous FFI, but at least you can (and must) specify parameter and return types when you import a foreign procedure from a shared lib that way, allowing for checks for parameter correctness at the call site, if not the import site.
If they each make it a Lisp: oh no, how many Lisps do we need?
There's nothing wrong with that, but , oh, look, a new scheme, yea. None of the previous 70 changed my life in any meaningful way.
Functional programming is easily available in almost any modern lang, virtually all of which have better tooling (and no, I have zero interest in using emacs) and ecosystems.
a bit of googling also came up with https://www.quora.com/How-has-Scheme-been-used-in-real-world...
> virtually all of which have better tooling (and no, I have zero interest in using emacs) and ecosystems
Anyway, there are a lot of Lisp-like (for a given value of like) language implementations indeed, but then there are also a lot of recordings of various orchestras performing Beethoven's 6th Symphony.
Someone making just a RNRS Scheme, with nothing new in it compared to other Schemes is at least honest.