ping II/IDEC networks :: develop.16 :: Обсуждение вопросов программирования | Contacts :: Login |
(defun split (str delimiter &key (save-empty nil)) (setq delimiter (coerce delimiter 'character)) (let ((result nil) (len (length str)) (j 0) (toappend "")) (dotimes (i len) (if (char= (char str i) delimiter) (progn (setq toappend (subseq str j i)) (setq result (append result (list toappend))) (setq j (1+ i)) ; если разделитель в конце, добавляем пустоту (if (= i (1- len)) (setq result (append result (list ""))))) (if (= i (1- len)) (setq result (append result (list (subseq str j len))))))) (if (equal save-empty nil) ; убираем пустые строки, если они не нужны (setq result (loop for s in result when (not (string= s "")) collect s))) result)) (defun dotest (vals) (dolist (s vals) (print (apply #'split (eval s))))) (dotest '((list "/x/features/" "/") ; проверяем, что всё верно работает (list "/ffggg/kikj//kjjj///" "/" :save-empty t) (list "x/features" "/")))