Схема макроса парной обработки вопроса
(На данный момент, пожалуйста, не обращайте внимания на то, что мне нужно, это не 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
состояние (определяется во время выполнения).