这似乎是一个疯狂的宏,特别是当SRFI 26使用起来更加直观时。而不是(wrap list (0 'blah) (2 'bloo) (4 'blee))
,您可以使用:
(cut list 'blah <> 'bloo <> 'blee <...>)
这肯定更容易阅读。
如果你真的必须写这样一个宏,这里有一种方法,将 of 的用法转换为 的wrap
等价用法cut
:
(require (for-syntax syntax/parse) srfi/26)
(define-syntax (wrap stx)
(syntax-parse stx
((_ func:expr (idx:nat expr:expr) ...)
(let* ((alist (map cons
(syntax->datum #'(idx ...))
(syntax-e #'(expr ...))))
(upper (add1 (apply max -1 (map car alist))))
(listfunc (lambda (i)
(cond ((assv i alist) => cdr)
(else #'<>)))))
(with-syntax (((args ...) (build-list upper listfunc)))
#'(cut func args ... <...>))))))
回答你的问题的关键,关于如何在给定语法对象的情况下获取整数,是使用syntax->datum
(for deep syntax-stripping) 或syntax-e
(for shallow syntax-stripping)。
(PS(致阅读本文的 Racket 专家。)我是新手syntax-parse
,所以我相信syntax-parse
专家可以找到更好的方法来编写上述内容。我最初将宏编写为syntax-case
宏,然后对syntax-parse
语法类进行了处理。就是这样。 )