Scheme宏成对处理题

Scheme macro pairwise processing question

(现在请忽略我追求的是 un-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)))

我对如何以我喜欢的方式成对处理这些元素,而不需要用户添加内括号有点困惑。

你可以用递归来做到这一点。而不是只有一个看起来像

的案例
((_ key value ...)
 (list (cons key (m value)) ...))

你可以有两种情况看起来像

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

与设计递归列表处理函数的方式类似,但基本情况是 syntax-rules 情况(在编译时检测)而不是 ifcond 条件(在 运行 时间检测到)。