我可以创建一个宏,以便用sequence-
来调用s-
个函数吗?因此,我应该能够写s-length
,s-filter
和s-map
而不是sequence-length
,sequence-filter
和sequence-map
。感谢。
答案 0 :(得分:3)
您可以使用racket/require
中的filtered-in
来执行此类转换。这是一个简单的例子:
#lang racket
(require racket/require
(filtered-in (λ (name) (regexp-replace #rx"^sequence-" name "s-"))
racket/sequence))
(s-ref '(1 2 3) 1)
如果您发现自己经常使用此类内容,那么编写一个扩展为filtered-in
的{{3}}并不会太难:
#lang racket
(require (for-syntax racket/require-transform
syntax/parse)
racket/require)
(define-syntax reprefix-in
(make-require-transformer
(syntax-parser
[(_ original-prefix:id new-prefix:id require-spec:expr ...)
#:with replacer (string-append "^" (regexp-quote (symbol->string (syntax-e #'original-prefix))))
#:with replacement (symbol->string (syntax-e #'new-prefix))
(expand-import #'(filtered-in (λ (name) (regexp-replace (regexp 'replacer) name 'replacement))
(combine-in require-spec ...)))])))
然后你可以像这样使用它:
(require (reprefix-in sequence- s- racket/sequence))
(s-ref '(1 2 3) 1)
答案 1 :(得分:1)
是的。对于诡计多端的水平。
然而,我强烈建议您这样做的方法是使用rename-in
在导入时重命名这些功能。例如,您的代码如下所示:
#lang racket
(require (rename-in racket/sequence
[sequence-length s-length]
[sequence-map s-map]
[sequence-filter s-filter]
...))
还有其他更高级的方法,您无需使用module->exports
,regexp-match
,format-id
和make-require-transformer
明确列出每个标识符。但这对我来说似乎很脆弱,你最好明确指出你要重命名的名字。