方案宏成对处理问题

时间:2019-04-01 13:57:35

标签: macros scheme syntax-rules

(目前,请忽略我所追求的是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)))

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

1 个答案:

答案 0 :(得分:1)

您可以使用递归进行此操作。而不是像这样的情况

Demo_600x600

您可以看到两种情况

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

类似于您设计递归列表处理函数的方式,但基本情况为((_) '()) ((_ key value . rest) (cons (cons key (m value)) (pairwise . rest))) 情况(在编译时检测到),而不是syntax-rulesif条件(在运行时检测到)。

相关问题