【问题标题】:`suffix-out` in Racket球拍中的“后缀输出”
【发布时间】:2016-08-28 22:43:47
【问题描述】:

我可以使用prefix-out 重命名我导出的标识符,使它们都具有相似的前缀。例如:

#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

【问题讨论】:

    标签: module racket


    【解决方案1】:

    您可以为此使用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)]))))
    

    【讨论】:

    • 谢谢。我其实一直很好奇的一件事,你知道filtered-outrename-out 的区别是什么吗?
    • @LeifAndersen filtered-out 实际上是 filter-map 在导出列表上,但 rename-out 只是一个明确的重命名列表。也就是说,前者可以对任意一组导出进行操作,但rename-out 将它们一一列出。关系更密切的两个是rename-outonly-out;前者导出所有内容并重命名列出的标识符,但 only-out 仅导出您明确列出的标识符。
    猜你喜欢
    • 1970-01-01
    • 2020-01-31
    • 2015-01-20
    • 2012-10-14
    • 1970-01-01
    • 2015-12-12
    • 2021-02-07
    • 2021-12-21
    • 2017-09-23
    相关资源
    最近更新 更多