What features of #CommonLisp can't be found in a larger #scheme distribution? I feel like I'm always hearing that scheme isn't full-featured enough for most #lisp hackers, but it's unclear what the average scheme is usually missing. On the other hand, I can think of quite a few features common in among schemes that you won't find in CommonLisp.
@rml CLOS and MOP are better respect many Scheme OOP libraries.
Generic functions are used also in contexts different from OOP.
CL macros are easier to write.
The error and exception handling of CL is very powerful and useful.
But the real answers for me are these:
1) CL live coding (i.e. interactive REPL) is very fun and addictive
2) there are many CL compilers with different characteristics at run-time accepting the same CL code, and that you are sure that you can use in production. For example with ECL you can produce C-friendly libraries.
3) a minor detail, but I like the fact that "nil" stays for false, and every other value for "true". The code become shorter.
@rml regarding `nil`: in CL it stays for the empty list and for the false value. There is no false value in CL. There is no true value in CL. Everything that is not `nil` is considered a true value.
To be sincere, it is an hack respect the elegance of Haskell algebraic approach. But, it is a convention that fits very well in the CL code and its usual semantic. For example `(or (car some-list) 0)` return the first non-nil value. It seems an hack like 0 and 1 that in C is false and true, but instead it allows to write very composable code. So it is a powerful and elegant hack.
On all other points, or I agree with you, or I trust you, because you seems more knowledgeable than me.
I think TSPL will give you a pretty broad sense of what scheme has that other programming languages are lacking. Of course, you pay for that at the expense of a having large ecosystem access. But I think part of the fun of learning scheme is learning to do ad-hoc implementation of low level interfaces, treating scheme as a kind of quantum duct tape that allows you to simply pause ports as suspendable continuations, making doing lots lower level io stuff simple.
But yeah, continuations aside CLisp certainly wins when it comes to port interfaces, it has everything and more.
@rml at best of my (limited) knowledge, I think that after some time you understand if you prefer Scheme or CL. CL is a little more on the "hacking side", while Scheme is a little more on the computer-science/elegant side.
The most advanced thing I tried with Racket is some code using the Nanopass compilation framework. I were impressed. Also Typed Racket is very good and readable.
But for some inexplicable reason, I feel more productive and happy using CL. It is less elegant, but it is so much powerful and production-oriented.
So, I will not read your book, because time is limited and I had yet dedicated some time to Scheme.
@mzan if you ever have some time to dig into scheme I would recommend reading Dybvig's The Scheme Programming Language (book proper is about K&R size + 200 pages of examples) as well as @spritelyinst's short and straight to the goods primer on contemporary scheme programming: https://spritely.institute/static/papers/scheme-primer.html