Racket:“提供”使用 lambda 进行区分

问题描述 投票:0回答:1

我的

define
文件中有一堆
utils.rkt
。 其中一些是辅助函数,我真的不想
provide
它们。 我浏览了文档(https://docs.racket-lang.org/reference/require.html),看起来
provide
#%provide
需要我想要排除的所有表单的明确列表。 我已经在每个助手的名称前添加了下划线,因此它们最终的名称如
_foo
_bar
_baz

provide
映射到
(filter not-helper-p (module->exports my-module))
似乎是一个不错的尝试,但
racket
抱怨
provide: not at module level
。 我还详细介绍了命名空间模块名称和加载以及提供

(define (foo x)
  (_foo x 0))

(define (_foo x y)
  (+ x y))

在这个示例中,我想要一种简单的方法来仅提供绑定到没有下划线前缀的符号的内容。 所以我应该只提供

foo
。 在实践中,我有很多这样的东西,并且通过名称明确地排除它们会很痛苦。

我对

racket
比较陌生:做这种事情有更常见的模式吗?

export racket
1个回答
0
投票

我仍然认为显式列出导出的符号(通过函数的

contract-out
)是可行的方法,但我最近注意到文档中用于进行此类过滤的
matching-identifiers-out
filtered-out

#lang racket/base

(require racket/provide)
(provide
 ;; Filter out symbols without a leading _
 (matching-identifiers-out #rx"^[^_]" (all-defined-out))) 

(define foo 1)  ; exported
(define bar 2)  ; exported
(define _foo 3) ; not exported
© www.soinside.com 2019 - 2024. All rights reserved.