Сообщения в split-sequence

split-sequence

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

Заглянул тут в код iicl и задумался: а зачем же использовать сабж? Для нужд ii вполне можно взять какую-нибудь самописную функцию и не тянуть лишние зависимости через quicklisp.
Или дело в каких-нибудь заморочках с производительностью?
vit01 to Andrew Lobanov (2015-12-27 15:55:50) [ссылка]

Re: split-sequence

Ответ на сообщение
vit01> Вопрос Андрею, как знатоку CL.
Я не знаток CL, к сожалению. Катострофически не хватает времени на всё. Так что знаю его весьма поверхностно.
vit01> Заглянул тут в код iicl и задумался: а зачем же использовать сабж? Для нужд ii вполне можно взять какую-нибудь самописную функцию и не тянуть лишние зависимости через quicklisp.
iicl - мой учебный проект, на котором я учился писать хоть что-нибудь на CL. Там многое сделано очень плохо и криво. split-sequence я взял потому что проще взять готовое. Вот если бы отказаться от drakma или hunchentoot это да, в split-sequence маленький и не критичный.
vit01> Или дело в каких-нибудь заморочках с производительностью?
Дело в ламерстве =)
Andrew Lobanov to vit01 (2015-12-30 05:18:19) [ссылка]

Re: split-sequence

Ответ на сообщение
// ура, наконец-то кто-то из "своих" появился в ii =)
AL> split-sequence я взял потому что проще взять готовое. Вот если бы отказаться от drakma или hunchentoot это да, в split-sequence маленький и не критичный.
hunchentoot, насколько слышал, присутствует в репозиториях дебиана (и, скорее всего, других дистрибутивов). Так что чем меньше посторонних зависимостей, тем проще будет отказаться именно от quicklisp, а не от самого нужного.
vit01 to Andrew Lobanov (2015-12-30 08:02:46) [ссылка]

Re: split-sequence

Ответ на сообщение
vit01> // ура, наконец-то кто-то из "своих" появился в ii =)
Суета в виде фарша из работы (конец года это жесть), учёбы и предновогодней подготовки отняла всё время.
AL>> split-sequence я взял потому что проще взять готовое. Вот если бы отказаться от drakma или hunchentoot это да, в split-sequence маленький и не критичный.
vit01> hunchentoot, насколько слышал, присутствует в репозиториях дебиана (и, скорее всего, других дистрибутивов). Так что чем меньше посторонних зависимостей, тем проще будет отказаться именно от quicklisp, а не от самого нужного.
Я противник в данном случае завязывания на систему. quicklisp это вполне себе штатное уже решение, которое даёт гарантию простого запуска на любой системе, где есть лисп-машина и интернет.
Andrew Lobanov to vit01 (2015-12-30 08:41:02) [ссылка]

Re: split-sequence

Ответ на сообщение
Так или иначе, попробовал набросать подобную функцию сам.
Скорее всего, это г...код, но всё же:
(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" "/")))
// укажите кто-нибудь на недочёты, пожалуйста
vit01 to Andrew Lobanov (2016-01-02 04:28:07) [ссылка]