Схема макроса парной обработки вопроса - PullRequest
2 голосов
/ 01 апреля 2019

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

1 голос
/ 01 апреля 2019

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

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

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

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

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

...