2016-08-28 2 views
2

Я могу использовать prefix-out, чтобы переименовать мои экспортированные идентификаторы, чтобы все они имели аналогичный префикс. Например:`suffix-out` в Racket

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

А теперь mymod:x и mymod:y должны быть привязаны к x и y внутри этого файла.

Есть ли аналогичный способ добавления суффикса ко всем идентификаторам, которые экспортирует модуль? Так что я могу сделать что-то вроде:

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

И теперь любой модуль, который необходим этот бы x-from-mymod и y-from-mymod связаны с x и y в этом модуле.

ответ

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 'filter-out' является фактически' filter-map' над списком экспорта, но 'rename-out' является просто явным списком переименований. То есть, первые могут работать над произвольным набором экспорта, но «переименование» перечисляет их по одному. Эти два более близких отношения - это «переименование» и «только-выход»; первый экспортирует все и переименовывает перечисленные идентификаторы, но 'only-out' экспортирует только те идентификаторы, которые вы явно перечисляете. –

+0

А, да, это имеет смысл. Спасибо.^_ ^ –

Смежные вопросы