I'm trying to take user input and storing it in a list, only instead of a list consisting of a single string, I want each word scanned in to be its own string. Example:
> (input)
This is my input. Hopefully this works
would return:
("this" "is" "my" "input" "hopefully" "this" "works")
Taking note that I don't want any spaces or punctuation in my final list.
Any input would be greatly appreciated.
split-sequence
is the off-the-shelf solution.
you can also roll your own:
(defun my-split (string &key (delimiterp #'delimiterp))
(loop :for beg = (position-if-not delimiterp string)
:then (position-if-not delimiterp string :start (1+ end))
:for end = (and beg (position-if delimiterp string :start beg))
:when beg :collect (subseq string beg end)
:while end))
where delimiterp
checks whether you want to split on this character, e.g.
(defun delimiterp (c) (or (char= c #\Space) (char= c #\,)))
or
(defun delimiterp (c) (position c " ,.;/"))
PS. looking at your expected return value, you seem to want to call string-downcase
before my-split
.
PPS. you can easily modify my-split
to accept :start
, :end
, :delimiterp
&c.
PPPS. Sorry about bugs in the first two versions of my-split
. Please consider that an indicator that one should not roll one's own version of this function, but use the off-the-shelf solution.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With