重命名序列函数的宏
Macro for renaming sequence- functions
我可以创建一个宏,以便我可以使用 s-
调用 sequence-
函数吗?因此,我应该可以写 s-length
、s-filter
和 s-map
而不是 sequence-length
、sequence-filter
和 sequence-map
。谢谢。
是的。掌握笨拙程度。
但是,我强烈建议您使用的方法是使用 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
, and make-require-transformer
明确列出每个标识符。但这对我来说似乎很脆弱,你最好明确说明要重命名的名称。
您可以使用 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)
如果你发现自己经常使用这种东西,写一个 require transformer 并扩展到 filtered-in
:
就不会太难了
#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)
我可以创建一个宏,以便我可以使用 s-
调用 sequence-
函数吗?因此,我应该可以写 s-length
、s-filter
和 s-map
而不是 sequence-length
、sequence-filter
和 sequence-map
。谢谢。
是的。掌握笨拙程度。
但是,我强烈建议您使用的方法是使用 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
, and make-require-transformer
明确列出每个标识符。但这对我来说似乎很脆弱,你最好明确说明要重命名的名称。
您可以使用 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)
如果你发现自己经常使用这种东西,写一个 require transformer 并扩展到 filtered-in
:
#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)