【问题标题】:Clojure namespacesClojure 命名空间
【发布时间】:2011-08-31 18:22:38
【问题描述】:

我想将一个大的 clojure-script 拆分成较小的。它看起来像这样。

一个:

(ns one
  (:use [two :only (show)]))

(def status "WORKING")

两个:

(ns two
  (:use [one :only (status)]))

(defn show [] (println status))

结果:异常

PS 我知道会发生某种递归命名空间构造。我只知道一个草率的半解决方案,例如 defining without body before 引用命名空间?有什么建议吗?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    +1 为 ponzao 的答案。更详细一点:命名空间的循环依赖通常是一个标志,表明你没有得到你的抽象和/或 API 正确。要么你“混合”层,要么事物应该只在一个命名空间中,因为它们真的属于一起。

    如果您只想将一个命名空间拆分为多个文件,这也是可以的。

    名称/空间.clj:

    (ns name.space)
    
    (declare status)
    
    (load "space_one")
    (load "space_two")
    

    名称/space_one.clj:

    (in-ns 'name.space)
    (defn show [] (println status))
    

    名称/space_two.clj:

    (in-ns 'name.space)
    (def status "WORKING")
    

    【讨论】:

    • Clojure 不支持命名空间之间的循环依赖。你必须设计来避免它。
    • @stuart-sierra 我说了什么不同的吗?
    【解决方案2】:

    您正在构建两个组件之间的循环依赖关系,您确定这是您想要的吗?为什么不使用第三个命名空间来包含它们的常用功能?

    【讨论】:

    • 不想想通过进行多层抽象等来过度设计一个简单的项目。一个文件保存数据、设置, 以及处理的一切。我不想将它用作网络服务的一部分。但是对于桌面调试,我使用简单的可视化,它从主脚本中读取设置,但提供了一个函数来在屏幕上显示这个东西。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-04-15
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2011-03-25
    相关资源
    最近更新 更多