Я знаю, что subseq в lisp возвращает подпоследовательность через диапазон. Есть ли что-нибудь, что вернет подпоследовательность, кроме этого диапазона, и должно быть неразрушающим? Любая помощь приветствуется.
ты не можешь просто:
(defun seq-drop-subseq (SEQ START &optional END)
(if END
(nconc (seq-take START) (seq-drop END))
(seq-take START)))
редактировать: пришлось пойти посмотреть. remove
делает это.
Вы можете сделать это для любой последовательности с concatenate
и subseq
:
(defun sequence-except (sequence start end)
(concatenate (sequence-type sequence)
(subseq sequence 0 start)
(subseq sequence end)))
Следующего должно быть достаточно, чтобы определить тип входной последовательности для битовых векторов, строк и т. д.:
(defun sequence-type (sequence)
(etypecase sequence
(list 'list)
(array `(array ,(array-element-type sequence) (*)))))
Тесты:
(loop for test in (list
#*10101001
"abcd"
'(0 3 2)
nil
#(1 2 3 4)
(make-array 4
:adjustable t
:fill-pointer T
:initial-contents
'(a b c d)))
collect (concatenate (sequence-type test) test))
Нет ничего встроенного. Получите подпоследовательность перед диапазоном и подпоследовательность после него, а затем соедините их с помощью
nconc
.