我有一个宏在传递一个参数时工作,我想扩展它以使用 ... 接受 n 个参数,但我无法弄清楚语法。
该宏要么接受自定义语法,即key:val key:val,要么接受一个过程。
例如:(3种不同的用法)
(schema-properties [(name:first-name type:string)])
(schema-properties [(name:age type:number required:#t)])
(schema-properties [(my-custom-fn arg1 arg2 arg3)])
定义:
(define-syntax (schema-properties stx)
(syntax-parse stx
[(_ [(prop:expr ...)])
(with-syntax ([prop0 (make-prop-hash #'(prop ...))])
#'(list prop0))]))
(define-for-syntax (make-prop-hash stx)
(with-syntax ([(props ...) stx])
(if (regexp-match #px":"
(symbol->string (car (syntax->datum #'(props ...)))))
#'(pairs->hash 'props ...)
#'(props ...))))
这是有效的,因为它检查 prop:expr 语法是否存在“:”,如果存在,则将其传递给函数(pairs->hash 'props ...),否则,它只是调用它(props ...)。
现在,我希望能够通过:
(schema-properties [(name:first-name type:string)
(name:last-name type:string)
(my-fn arg1 arg2 arg3)])
并让它以同样的方式工作。但我目前处于省略号地狱中,我的大脑不再正常工作。
任何见解都值得赞赏。