Shammer's Philosophy

My private adversaria

文字列の分割

Lisp で文字列を分割させたい。Java でいうところの split のようなもの。標準ではないようなのでちょろっと書いてみた。

(defun split-string (split-char target)
  (let ((splitted-string nil))
    (do ()
	()
      (let ((first-index (position split-char target)))
	(when (null first-index)
	  (setf splitted-string
		(append splitted-string
			(cons target nil)))
	  (return))
	(setf splitted-string
	      (append splitted-string
		      (cons (subseq target 0 first-index) nil)))
	(setf target (subseq target (+ 1 first-index)))))
    splitted-string))

以下のように使用する。

(print (split-string #\Space "aaa dddd kkkkkk ss c lllllllll"))
(print (split-string #\: "aaa dddd: kckg:: kkkkk"))
(print (split-string #\Space "aaa dddd kkkkk ss c "))

この実行結果は以下のようになる。

$ ccl64 -l string.lisp

("aaa" "dddd" "kkkkkk" "ss" "c" "lllllllll")
("aaa dddd" " kckg" "" " kkkkk")
("aaa" "dddd" "kkkkk" "ss" "c" "")

文字列が分割されて、分割されたものはリストになるようにしてみた。