【问题标题】:How to make symbol(s) from namespace accessible in all namespaces w/o qualifier?如何使命名空间中的符号可以在所有没有限定符的命名空间中访问?
【发布时间】:2016-05-24 13:03:40
【问题描述】:

我的命名空间带有仅用于开发的调试实用程序。我想让它们在所有没有限定符的命名空间中都可以访问(与 clojure.core 中的符号相同)。

假设我的项目结构如下:

dbg_utils.clj

(ns project.dbg-utils)

(defmacro dbg ...)

db.clj

(ns project.db)

(defn create-entity [...]
  ...)

在我想启动 REPL 并输入如下内容之后:

> (require 'project.db)
> (require 'project.dbg-utils)
> (globalize-symbol 'project.dbg-utils/dbg)

在使用dbg 没有限定符的宏之后:

(ns project.db) ;; no require of project.dbg-utils

(defn create-entity [...]
  (dbg ...) ;; and no qualifier here
  ...)

有类似globalize-symbol(或接近这个)的东西吗?

【问题讨论】:

  • 你想不使用require和/或intern吗?
  • @PiotrekBzdyl 可能我的问题没有很好地形成。让我稍微改一下。
  • @PiotrekBzdyl 回答您的问题:是的,我想在没有 require'ing dbg-utils 命名空间的情况下访问它们。
  • 您要解决的问题是什么:到处都需要这样的命名空间或在生产模式下调试宏的潜在开销?
  • 您可以使用 leiningen 的 :injections 功能和 :user 配置文件。 This article 分享了一些关于如何做到这一点的建议。它基本上是通过将所有命名空间中所需的函数添加到 clojure.core 来工作的,因为在使用 ns 宏时总是包含它的所有公共变量。

标签: clojure namespaces


【解决方案1】:

Leiningen 为此提供了:injections 功能和:user 配置文件。

This article 分享了一些关于如何做到这一点的建议。它基本上通过将您想要的调试函数添加到 clojure.core 来工作,并且由于在使用 ns 宏时始终包含来自此命名空间的所有公共变量(除非您另外指定),您将在所有命名空间中使用它们。

【讨论】:

    猜你喜欢
    • 2021-02-05
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    相关资源
    最近更新 更多