Tim Bradshaw writes about Common Lisp, macros, Lisp machines, and old Usenet culture, along with a long-running collection of Lisp hacks.
HN commenters link his Lisp hacks as examples of DSL-style macro tricks and his Mad people of comp.lang.lisp page for Usenet history.
I think this is one of the failings of Common Lisp. For the example of snarfing a file into a single string, here are some examples of the fun you can have:
http://www.emmett.ca/~sabetts/slurp.html
http://www.tfeb.org/lisp/obscurities.html#SNARFING-FILES
http://www.codecodex.com/wiki/index.php?title=Read_a_file_into_a_byte_array#Common_Lisp
http://www.cl-user.net/asp/html-docs/process-file-snippset
According to the first link, this turns out to be the most efficient and most idiomatic way to do it:
(defun slurp-stream5 (stream)
(let ((seq (make-array (file-length stream) :element-type 'character :fill-pointer t)))
(setf (fill-pointer seq) (read-sequence seq stream))
seq))
Makes sense once you know what all the pieces mean, but not the first thing a new Common Lisp programmer will think of. Then, in the SNARFING-FILES link, turns out it's not correct for all files, anyway, and the "correct" version is considerably longer.
EDIT: Oops. The code I pasted DID include the proper file length check (at the cost of reading into an array of characters, instead of a string). So ignore the last sentence of my (unedited) post.
Tried to contribute to a Go project a few months ago and got bitten by https://github.com/golang/go/issues/67296 due to questionable doc quality. I was pretty disappointed to find that natural sort isn't builtin since Go was the Unicode language in my mind (Go runes, made by some Plan 9 thus UTF-8 creators).
Go has a lot of good points, but I immediately felt "dirty" when using it. Like that time when I tried to wrap a closure variable over itself ("my_closure = new closure calling my_closure") and needed to use a temporary variable because closure captures are always by reference: if you want to build abstractions, you got to think them better; as it stands, this is the worst of both worlds I know (C++ makes capture type explicit and customizable, Common Lisp was designed by wizards who knew what to do cf https://www.tfeb.org/fragments/2023/02/22/how-to-understand-closures-in-common-lisp/).
See cl-who for another example: http://weitz.de/cl-who/#syntax
Also, this has nothing to do with functional programming but rather with creating a DSL (http://en.wikipedia.org/wiki/Domain-specific_language)
More links:
• http://www.tfeb.org/lisp/hax.html#HTOUT
• https://github.com/franzinc/aserve/blob/master/htmlgen/test.cl
A lisp with T, NIL, if, and lambda, like "tiny-lisp" here:
http://tfeb.org/lisp/hax.html#CONDUITS
Literally, a package hack with zero implementation :-)
Import defmacro and friends and you have it.
Some of the personalities who appear in that thread are mentioned in this list of "Mad people of comp.lang.lisp":
http://www.tfeb.org/lisp/mad-people.html
Sadly, these multiple identities are not angry enough to qualify him as a "Mad people of comp.lang.lisp"
http://www.tfeb.org/lisp/mad-people.html