【问题标题】:What's wrong with single segment namespaces?单段命名空间有什么问题?
【发布时间】:2012-11-14 01:28:26
【问题描述】:

我在几个地方读到过 clojure 不鼓励使用单段命名空间。

事实上,我见过的几乎每个库都有 (require 'lib.core) 而不是 (require 'lib)。

为什么?


编辑:我有点傻。对于单个段命名空间可能是坏事的简明示例,我们将给予额外奖励。

【问题讨论】:

  • 是的,但如果你只是在玩 Clojure,尝试一些东西,而不在乎,我一直使用单段命名空间,这样不用创建一个更方便目录布局。对于真正的项目,不要这样做,因为别人说了算。

标签: clojure namespaces


【解决方案1】:

Java 不鼓励使用默认包,因为您不能从任何其他包中引用其中的任何内容。如果您预编译一个单段 Clojure 命名空间,您将在默认包中获得一个 Java 类。如果有人在任何时候想从 Java 中使用您的库,他将被这种琐碎的事情阻止。由于没有充分的理由支持使用单段命名空间,而且有一个明确的理由不这样做,因此可以公平地说,在 Clojure 中不鼓励使用单段命名空间。

【讨论】:

  • 好的,所以 doom.clj -> doom.class 但是(ns 恐怖.doom)在恐怖/doom.clj 中进入恐怖包中的doom.class?而且我必须有子目录恐怖才能使用(nshorror.doom)?
  • 是的,这就是 Clojure 根据命名空间自动定位 .clj 文件的约定。
  • >因为没有充分的理由支持使用单段命名空间 简单对我来说似乎是一个足够好的理由,如果我们谈论的是“应该”而不是什么目前在技术上是可行的。
【解决方案2】:

单段命名空间存在 Java 互操作问题。有些事情可能会以意想不到的方式破裂。另见https://groups.google.com/forum/?fromgroups=#!topic/clojure/gOffhotk25Y

【讨论】:

  • 我读到了,但我仍然不确定发生了什么。我能翻译的最好的就是“有一些令人厌恶的 java 流产进入 clojure,但目前尚不清楚它实际上是如何变坏的。”还是谢谢。
  • 在 JVM 上的 clojure 中,(ns foo.bar)package foo 中生成 class bar,bar 中定义的函数作为 bar 的内部类.这意味着 clojure 中的“顶级”命名空间实际上是“无包”类,由 JVM 和/或 Java 专门处理(以某些可能出乎意料的方式)。
猜你喜欢
  • 2011-02-28
  • 2011-02-05
  • 1970-01-01
  • 2012-10-24
  • 2010-09-12
  • 2014-08-10
  • 2013-03-26
  • 2016-05-14
相关资源
最近更新 更多