You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Racket中通过Lambda筛选自动导出非下划线前缀符号?

Racket批量导出非下划线开头函数的通用方案

核心思路

直接在模块顶层筛选出所有非下划线开头的定义符号,再批量导出,无需手动逐个列出需要暴露的函数。

实现代码示例

#lang racket

;; 辅助函数(下划线开头,不对外暴露)
(define _helper1 (λ () "helper1"))
(define _helper2 (λ () "helper2"))

;; 对外提供的函数
(define foo (λ () "foo"))
(define bar (λ () "bar"))

;; 筛选非下划线开头的符号
(define export-syms
  (filter (λ (sym)
            (not (char=? #\_ (string-ref (symbol->string sym) 0))))
          (map car (module->exports #f))))

;; 批量导出筛选后的符号
(provide . export-syms)

关键细节解释

  • (module->exports #f):获取当前模块的所有导出项,返回的列表每个元素是(符号 导出类型)结构,用map car提取出符号本身。
  • 筛选逻辑:将符号转为字符串,检查首字符是否为下划线,排除这类辅助函数符号。
  • (provide . export-syms):通过.展开列表,实现批量导出所有符合条件的符号。

更简洁的替代写法

用for/list结合current-module-declarations遍历模块定义:

#lang racket

(define _helper1 (λ () "helper1"))
(define foo (λ () "foo"))

(define export-syms
  (for/list ([(sym _) (in-hash (current-module-declarations))]
             #:when (not (char=? #\_ (string-ref (symbol->string sym) 0))))
    sym))

(provide . export-syms)

注意事项

  • 所有筛选逻辑必须放在模块顶层,因为provide只能在模块顶层执行,不能嵌套在其他表达式内部。
  • 如果需要排除其他特殊符号,只需修改筛选条件即可,比如添加额外的字符判断或符号匹配规则。

内容的提问来源于stack exchange,提问作者eppo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 20:51:00