When `if` lacks one of the branches `when` and `when-not` are preferred.
Use meaningful names
String is a seq of char. You can avoid that str
You don't need to add seq, seq-like operations do it for you
Instead of searching you can benefit from using sets
Yep, there is a fn for that
Simplify
map, filter & friends are lazy, you better use doseq or doall for IO

Read about this...
Introduce new domain concepts (e.g. label) for increasing abstraction.
It can look like a step backwards but...
Make labels with make-label
Inline join-strings to rearrange the code
Keep is a map that only "keeps" non-nil values
when-let is very useful to do stuff depending on something being null
We move from when-let to if-let to simplify the expression
We pay back the inlining of join-strings by extracting a different fn, label-seq
Garbage collection