The version with small functions, similar to the Haskell version:
(subseq
(remove-if
(complement #'numberp)
(butlast list 3))
0 5)
In above Common Lisp code, we use four different functions which do one task: * subseq sequence start &optional end => subsequence
* remove-if test sequence => result-sequence
* complement function => complement-function
* butlast list &optional n => result-list
For different approaches see Common Lisp libraries like Series or Iterate... Iterate is LOOP on steroids.https://common-lisp.net/project/iterate/
> This is known as composability, or the UNIX philosophy. In Lisp a procedure tends to accept many options which configure its behaviour.
Check out the UNIX man for tail, grep, ... to see how strange above quote about 'unix philosophy' is. In reality Unix commands are programs with obscene amount of configuration options, sometimes piping data as text around, sometimes glued together by strange shell languages...