ユーザー入力を取得してリストに保存しようとしています。単一の文字列で構成されるリストではなく、スキャンされた各単語を独自の文字列にします。例:
> (input)
This is my input. Hopefully this works
戻ります:
("this" "is" "my" "input" "hopefully" "this" "works")
最終的なリストにスペースや句読点を入れたくないことに注意してください。
任意の入力をいただければ幸いです。
split-sequence
既製のソリューションです。
自分でロールすることもできます:
(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))
delimiterp
この文字で分割するかどうかをチェックします。
(defun delimiterp (c) (or (char= c #\Space) (char= c #\,)))
また
(defun delimiterp (c) (position c " ,.;/"))
PS。string-downcase
期待される戻り値を見ると、前に呼び出したいようですmy-split
。
PPS。, , &cmy-split
を受け入れるように簡単に変更できます。:start
:end
:delimiterp
PPPS。の最初の 2 つのバージョンのバグについて申し訳ありませんmy-split
。これは、この関数の独自のバージョンを作成するのではなく、既製のソリューションを使用するべきであるという指標と考えてください。
; in AutoLisp usage (splitStr "get off of my cloud" " ") returns (get off of my cloud)
(defun splitStr (src delim / word letter)
(setq wordlist (list))
(setq cnt 1)
(while (<= cnt (strlen src))
(setq word "")
(setq letter (substr src cnt 1))
(while (and (/= letter delim) (<= cnt (strlen src)) ) ; endless loop if hits NUL
(setq word (strcat word letter))
(setq cnt (+ cnt 1))
(setq letter (substr src cnt 1))
) ; while
(setq cnt (+ cnt 1))
(setq wordlist (append wordlist (list word)))
)
(princ wordlist)
(princ)
) ;defun