Как я могу получить часть списка перед специальным элементом? - PullRequest
2 голосов
/ 24 сентября 2019

С ЧЛЕНОМ я получаю искомый элемент и остальную часть СПИСКА.Но как я узнал об этих элементах до того, как будет найден искомый элемент?

(CDR (MEMBER 'DURCH '(ZEIT MAL LAENGE DURCH MASSE MAL ZEIT))); with this I get (MASSE MAL ZEIT)
;But how did I get (ZEIT MAL LAENGE) 

Ответы [ 3 ]

5 голосов
/ 24 сентября 2019

Принятый ответ правильный (и более эффективный), но если вам нужны стандартные функции, используйте LDIFF (т.е. разница в списке):

(let ((list '(ZEIT MAL LAENGE DURCH MASSE MAL ZEIT)))
    (ldiff list (MEMBER 'DURCH list)))

=> (ZEIT MAL LAENGE)
5 голосов
/ 24 сентября 2019

Вы можете вернуть обе части за один проход:

CL-USER> (defun split-at (item list &key (test #'eql))
           (loop :for (x . rest) :on list
                 :until (funcall test x item)
                 :collect x :into head
                 :finally (return (values head rest))))
SPLIT-AT
CL-USER> (split-at 'durch '(a mal b durch c mal d))
(A MAL B)
(C MAL D)
5 голосов
/ 24 сентября 2019

Иногда эти функции так легко написать, а решение настолько прозрачно, что читать бессмысленно, какая комбинация стандартных функций будет делать то, что вы хотите:

(defun elts-before (l elt &key (test #'eql))
  (loop for e in l
        until (funcall test e elt)
        collect e))
...