# split-sequence
vit01(mira, 1) — Andrew Lobanov
2015-12-27 15:55:50


Вопрос Андрею, как знатоку CL.

Заглянул тут в код iicl и задумался: а зачем же использовать сабж? Для нужд ii вполне можно взять какую-нибудь самописную функцию и не тянуть лишние зависимости через quicklisp.
Или дело в каких-нибудь заморочках с производительностью?

# Re: split-sequence
Andrew Lobanov(station13, 1) — vit01
2015-12-30 05:18:19


vit01> Вопрос Андрею, как знатоку CL.

Я не знаток CL, к сожалению. Катострофически не хватает времени на всё. Так что знаю его весьма поверхностно.

vit01> Заглянул тут в код iicl и задумался: а зачем же использовать сабж? Для нужд ii вполне можно взять какую-нибудь самописную функцию и не тянуть лишние зависимости через quicklisp.

iicl - мой учебный проект, на котором я учился писать хоть что-нибудь на CL. Там многое сделано очень плохо и криво. split-sequence я взял потому что проще взять готовое. Вот если бы отказаться от drakma или hunchentoot это да, в split-sequence маленький и не критичный.

vit01> Или дело в каких-нибудь заморочках с производительностью?

Дело в ламерстве =)

# Re: split-sequence
vit01(mira, 1) — Andrew Lobanov
2015-12-30 08:02:46


// ура, наконец-то кто-то из "своих" появился в ii =)

AL> split-sequence я взял потому что проще взять готовое. Вот если бы отказаться от drakma или hunchentoot это да, в split-sequence маленький и не критичный.

hunchentoot, насколько слышал, присутствует в репозиториях дебиана (и, скорее всего, других дистрибутивов). Так что чем меньше посторонних зависимостей, тем проще будет отказаться именно от quicklisp, а не от самого нужного.

# Re: split-sequence
Andrew Lobanov(station13, 1) — vit01
2015-12-30 08:41:02


vit01> // ура, наконец-то кто-то из "своих" появился в ii =)

Суета в виде фарша из работы (конец года это жесть), учёбы и предновогодней подготовки отняла всё время.

AL>> split-sequence я взял потому что проще взять готовое. Вот если бы отказаться от drakma или hunchentoot это да, в split-sequence маленький и не критичный.

vit01> hunchentoot, насколько слышал, присутствует в репозиториях дебиана (и, скорее всего, других дистрибутивов). Так что чем меньше посторонних зависимостей, тем проще будет отказаться именно от quicklisp, а не от самого нужного.

Я противник в данном случае завязывания на систему. quicklisp это вполне себе штатное уже решение, которое даёт гарантию простого запуска на любой системе, где есть лисп-машина и интернет.

# Re: split-sequence
vit01(mira, 1) — Andrew Lobanov
2016-01-02 04:28:07


Так или иначе, попробовал набросать подобную функцию сам.
Скорее всего, это г...код, но всё же:

(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" "/")))

// укажите кто-нибудь на недочёты, пожалуйста