2016-08-28 14 views
2

prefix-outを使用すると、エクスポートされた識別子の名前をすべて同じにすることができます。たとえば:`suffix-out` in Racket

#lang racket 
(provide (prefix-out mymod: (all-defined-out))) 
(define x 5) 
(define y 6) 

そして今mymod:xmymod:yは、そのファイルの内部でxyにバインドする必要があります。

モジュールがエクスポートしているすべての識別子に接尾辞を追加する同様の方法はありますか?私のような何かを行うことができるように:

#lang racket 
(provide (suffix-out -from-mymod (all-defined-out))) 
(define x 5) 
(define y 6) 

そして今、これを必要なモジュールがx-from-mymody-from-mymodは、このモジュールでxyにバインドされています。

答えて

3

あなたは、この目的のためにfiltered-outを使用することができます。

(require (for-syntax racket/base 
        racket/provide-transform 
        syntax/parse) 
     racket/provide) 

(define-syntax suffix-out 
    (make-provide-transformer 
    (lambda (stx modes) 
    (syntax-parse stx 
     [(_ suffix:id provide-spec) 
     (expand-export 
     #'(filtered-out (lambda (name) 
          (string-append name (symbol->string 'suffix))) 
         provide-spec) 
     modes)])))) 
+0

ありがとうございました。私が実際に好奇心をそそられてきたことの一つは、「フィルタリングされた」と「名前の変更」の違いは何ですか? –

+0

@LeifAndersen 'filtered-out'は、エクスポートのリストに対して効果的に' filter-map'を行いますが、 'rename-out'は明示的な名前変更リストです。すなわち、前者は任意の組のエクスポートに対して動作することができますが、名前を変更するとそれを1つずつリストします。より密接に関連している2つは、「名前の変更」と「唯一の変更」です。前者はすべてをエクスポートし、リストされた識別子の名前を変更しますが、 'only-out'は明示的にリストする識別子のみをエクスポートします。 –

+0

ああ、そうですね。ありがとうございました。^_ ^ –

関連する問題