Я хочу вставить между каждым элементом специального элемента списка.Например:
(EINFUEGEN '(A B C) '*);-> (A * B * C)
Как я могу реализовать это самым простым способом?
Интересный способ:
(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) и, наконец, ().
for <var> on <list>
var
(a b c)
(b c)
(c)
()
(x . xs) - это обозначение деструктурирующее для связывания соответственно xи xs к голове и хвосту каждого посещаемого списка.Здесь необходимо проверить, есть ли оставшиеся элементы.
(x . xs)
x
xs
collect <val> добавляет <val> к неявной создаваемой коллекции
collect <val>
<val>
when <test> <clause> выполняет предложение LOOP <clause> только тогда, когда удовлетворено <test>.Здесь я проверяю, есть ли еще элементы в списке;в таком случае я также собираю символ звезды.
when <test> <clause>
<clause>
<test>