重命名序列函数的宏

Macro for renaming sequence- functions

我可以创建一个宏,以便我可以使用 s- 调用 sequence- 函数吗?因此,我应该可以写 s-lengths-filters-map 而不是 sequence-lengthsequence-filtersequence-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)