I think it's a cultural thing where folks who insist on Functional Programming are already steeped in opaque math notation.
I've never been a fan of non English symbols aside from some gradeschool established things like your standard operations. (+ - * / etc)
At first encounter you can't be sure what -> and ->> are in Clojure for example. (Similar forms appear in Haskell and OCaml)
It is at least a clue to the reader had they been named "thread-first" and "thread-last" etc.
Thought on the other hand having SUBTRACT is kind of overkill to me.
Clojure in general has a few anti-patterns (in my opinion) that culturally they hold dear.
These contribute to that style:
1. Threading "Pipelines" instead of new functions. At worst you see the same kind of threading over and over instead of naming a process.
ex: (-> email message body signature) copied all over rather than simply naming that process once aka (get-signature email)
This hurts the code because you go looking for keywords and attempting to find all occurrences of this rather than adjusting get-signature once.
2. Separate the language from what you write, avoid macros.
This means that instead of tight little DSLs using macros you end up writing the same kind of thing over and over because the language is never shrunk to the domain.
Clojure "the language" is often treated as say C++ where the language is static and beyond extending. (This is NOT the case, but culturally the norm)
3. Data dispatch drives the show, never create specialised objects, "Hickey's Just Use Maps".
Because everything is a messy hashmap you actually create a kind of horrible duck typing.
This means that to even find out what a FOO consists of you may need to trace all the pipelines that interact with it many steps backward.
And even then it will be non deterministic since in your particular usage you might not be using an expected key.
So I think a lot of what you see is the result of immutable data containers being threaded through various transitional language functions with little abstraction.
It's sort of the opposite of what SICP teaches.
Scheme doesn't have the luxury of creating new complex strong types directly.
So SICP teaches how to properly safeguard and protect what it CAN do with contracts, naming, and predicates.
A new "thing" isn't just a generic hashmap, usually a mini DSL is created to ensure creating it properly and accessing it properly.
It's a bit like the record package in Interlisp. (Sure they can just be lists but we protect access and creation vis DSL).
SICP: The underlying implementation doesn't matter as much as concrete accessors (selectors in SICP terms) and the abstraction.
Clojure: Just use hashmaps bro.
I didn't mean to deliver a personal sermon, but apparently here we are. :P
Sincerely,
Ryan