Есть список аргументов. Из него нужно несколько раз сделать следующее:
1. Попнуть первый элемент
2. Вернуть ошибку, если его нет
3. (опционально) проверить kind и вытащить из него внутреннее значение. Вернуть ошибку, если kind неправильный.
4. Положить в переменную.
После того, как все аргументы обработаны, либо:
1. Оставить остаток как есть
либо
2. Проверить, что он пустой, вернуть ошибку, если нет
в зависимости от конкретного применения
А, ну тут можно индукцию на гетерогенных списках, думаю. Ну у тебя два варианта: макросы или индукция. Яб индукцию выбрал, т.к. тело макросов трудно разбирать, трудно понять что они вообще делают. Можешь посмотреть пример в demux-stream