Неразрушающая подпоследовательность - за исключением lisp - PullRequest
0 голосов
/ 07 апреля 2019

Я знаю, что subseq в lisp возвращает подпоследовательность через диапазон. Есть ли что-нибудь, что вернет подпоследовательность, кроме этого диапазона, и должно быть неразрушающим? Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

Вы можете сделать это для любой последовательности с помощью 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))
0 голосов
/ 07 апреля 2019

ты не можешь просто:

(defun seq-drop-subseq (SEQ START &optional END)
  (if END
      (nconc (seq-take START) (seq-drop END))
    (seq-take START)))

edit: должен был пойти посмотреть. remove делает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...