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
情况(在编译时检测)而不是 if
或 cond
条件(在 运行 时间检测到)。
(现在请忽略我追求的是 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
情况(在编译时检测)而不是 if
或 cond
条件(在 运行 时间检测到)。