dsorokin/generic-sequences — pull request #2 by sviridov (2012-12-15 09:51:33+00:00)
Title: Added GENERIC-SEQ-ITER:ON-SEQ driver. Added destructing

Добавлен ON-SEQ драйвер.

Теперь можно писать:

```lisp
CL-USER> (iter (for (a b . c) on-seq (seq-range))
(for i from 0 to 4)
(print (list a b c)))

(0 1 (2 . #))
(1 2 (3 . #))
(2 3 (4 . #))
(3 4 (5 . #))
(4 5 (6 . #))
NIL
```

Добавлен destructing для драйверов IN-SEQ и ON-SEQ. Можно в тестах примеры посмотреть.

В связи с destructing пришлось сделать несколько изменений:

1) enum-cdr теперь проверяет на nil свой аргумент. Если тот nil возвращает nil, а не выбрасывает исключение. Нужно в различных случаях, например:

```lisp
CL-USER> (iter (for (a b c) on-seq '(1 2 3))
(print (list a b c)))

(1 2 3)
(2 3 NIL)
(3 NIL NIL)
NIL
```
иначе не заработает.

2) изменил seq-enum для списка, теперь (enum-cdr (enum-cdr '(1 . 2))) вернет nil, а не исключение. Нужно и в iter, и в многих других местах где используется cons. Например, flatten должен выравнивать и cons. Без этого изменения flatten у меня не получалось написать.

Я не стал добавлять слово BY в драйверы т.к. есть seq-take-nth.