Macros Scheme宏成对处理问题

Macros Scheme宏成对处理问题,macros,scheme,syntax-rules,Macros,Scheme,Syntax Rules,(现在请忽略我想要的是un-Schemey,因为这是针对非程序员的DSL) 我想做一些与此等价的事情: (pairwise key1 value1 key2 value2) 这将扩展到这一点,m是我定义的另一个宏(因此我不能简单地使用可变类型函数): 我试过这个: (define-syntax pairwise (syntax-rules () ((_ key value ...) (list (cons key (m value)) ...)))) 但正如我猜想的那样

(现在请忽略我想要的是un-Schemey,因为这是针对非程序员的DSL)

我想做一些与此等价的事情:

(pairwise key1 value1 key2 value2)
这将扩展到这一点,
m
是我定义的另一个宏(因此我不能简单地使用可变类型函数):

我试过这个:

(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)))
与设计递归列表处理函数的方式类似,但基本大小写作为
语法规则
大小写(在编译时检测),而不是
if
cond
条件(在运行时检测)

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