2

(现在请忽略我所追求的是非方案,因为这是针对非程序员的 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)))

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

4

1 回答 1

1

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

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

你可以有两个看起来像的案例

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

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

于 2019-04-01T14:45:16.680 回答