Macros Scheme宏成对处理问题
(现在请忽略我想要的是un-Schemey,因为这是针对非程序员的DSL) 我想做一些与此等价的事情: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)) ...)))) 但正如我猜想的那样
(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)))