2016-08-20 48 views
1

我可以创建宏以便我可以用s-调用sequence-函数?因此,我应该可以写s-length,s-filters-map而不是sequence-length,sequence-filtersequence-map。谢谢。用于重命名序列功能的宏

回答

3

您可以使用racket/requirefiltered-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) 
+0

这应该放在一个库的某个地方吗? –

+0

@AlexKnauth可能。把它用在'racket/require'中可能是有道理的,但是我一直不愿意给'base'添加新东西,因为它是唯一的(明显)不能用于旧版Racket版本的包。我不确定在一个单独的软件包中使用它会带来多大的意义,但是对于我所写的一些其他需求/提供的变压器,这可能会更有价值。 –

1

是的。翻译cludgyness的水平。

但是,我强烈建议您的做法是使用rename-in在导入时重命名这些函数中的每一个。因此,例如,你的代码看起来像:

#lang racket 

(require (rename-in racket/sequence 
        [sequence-length s-length] 
        [sequence-map s-map] 
        [sequence-filter s-filter] 
        ...)) 

还有其他更先进的方法可以做到这一点,不要求你明确列出每个标识符,使用module->exportsregexp-matchformat-idmake-require-transformer。但是这对我来说似乎很脆弱,你最好明确你想要重命名的名字。