Схема макроса парной обработки вопроса

(На данный момент, пожалуйста, не обращайте внимания на то, что мне нужно, это не Schemey, потому что это для DSL, нацеленного на непрограммистов)

Я хотел бы сделать что-то эквивалентное этому:

(pairwise key1 value1 key2 value2)

Который расширится до этого, m будучи еще одним макросом, который я определил (следовательно, я не могу просто использовать функцию вариативного стиля):

(list (cons key1 (m value1)) (cons key2 (m value2)))

Я пробовал это:

(define-syntax pairwise
  (syntax-rules ()
    ((_ key value ...)
     (list (cons key (m value)) ...))))

Но, как я догадался, он расширился до:

(list (cons key1 (m value1)) (cons key1 (m key2)) (cons key1 (m value2)))

Я немного застрял в том, как обрабатывать эти элементы попарно желаемым способом, не требуя от пользователя добавления внутренних скобок.

1 ответ

Решение

Вы можете сделать это с помощью рекурсии. Вместо одного случая, который выглядит как

((_ key value ...)
 (list (cons key (m value)) ...))

Вы можете иметь два случая, которые выглядят как

((_)
 '())
((_ key value . rest)
 (cons (cons key (m value)) (pairwise . rest)))

Подобно тому, как вы разработали бы рекурсивную функцию обработки списков, но с базовым регистром как syntax-rules случай (обнаружен во время компиляции) вместо if или же cond состояние (определяется во время выполнения).

Другие вопросы по тегам