Как я могу вставить элемент между всеми элементами списка? - PullRequest
1 голос
/ 25 сентября 2019

Я хочу вставить между каждым элементом специального элемента списка.Например:

(EINFUEGEN '(A B C) '*);-> (A * B * C)

Как я могу реализовать это самым простым способом?

1 Ответ

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

Интересный способ:

(cdr (mapcan #'list '#1=(* . #1#) '(a b c)))

Приличный способ:

(loop
   for (x . xs) on '(a b c) 
   collect x
   when xs collect '*)
  • for <var> on <list> перебирает все подсписки, то есть var будет связандо (a b c), затем (b c), затем (c) и, наконец, ().

  • (x . xs) - это обозначение деструктурирующее для связывания соответственно xи xs к голове и хвосту каждого посещаемого списка.Здесь необходимо проверить, есть ли оставшиеся элементы.

  • collect <val> добавляет <val> к неявной создаваемой коллекции

  • when <test> <clause> выполняет предложение LOOP <clause> только тогда, когда удовлетворено <test>.Здесь я проверяю, есть ли еще элементы в списке;в таком случае я также собираю символ звезды.

...