2024 Clojure状态调查!中分享你的想法。

欢迎!请参阅关于页面以获取更多关于这一机制的信息。

+40
命名空间和变量
已关闭

使用限定关键字非常有用,尤其是与spec结合使用时。使用命名空间别名有助于在处理大量限定关键字时提高效率。然而,目前创建别名命名空间需要该命名空间实际存在。

此票据是一个占位符,用于对关键词轻量级别名做更多的事。具体细节待定。

已关闭,附带说明: Clojure 1.11.0-alpha2 新增了`require`中的`:as-alias`支持。这与`:as`创建别名的方式类似,但不引起装载。请参阅 CLJ-2123 了解详细信息。

9个答案

0

评论者:bendlas

希望能在1.9-beta之前开始这场对话。

在我的前任票据CLJ-2030中的理由是为了创建一个结构,允许在.cljc文件中进行自动别名化,我希望将其作为一项要求提交。Cljs声明自动别名的明显位置是ns子句。
因此,如果我们不希望因这个用例而扩展别名,我会提出将ns子句扩展到包含关键字别名声明。让我们给这个评论起一个工作标题为(:kwns-alias ...)。

:+kwns-alias将用于为::qualified/keywords建立命名空间别名

一个悬而未决的问题是,:kwns-alias应该如何与alias交互。也就是说,是否::qualified/keyword的命名空间应始终展开为与限定符号相同的命名空间,或者是否允许它们有所不同。我会主张它们应该始终相同,因为这符合简单性原则。这意味着:
-别名需要检查sym是否已在:kwns-alias中,如果是,则抛出异常
-:kwns-alias还需要处理`qualified/keywords可能不应该在它的名字中出现命名空间的前缀 anymore`

那么为 :kwns-alias 起一个好名字应该是什么呢?:let 如何样?

0

评论人:alexmiller

beta 版功能已全部完成,因此这不会在 1.9 版中实现。

我认为向 ns 添加任何内容可能都不是一个好主意,但在我了解更多关于 Rich 的想法之前,我无法提出更多建议。

0

评论者:bendlas

真遗憾。但也许 1.10 版本的发布周期会更短...

无论如何,我对 Rich 提出的在 ns 条件之外执行此操作,同时仍能与 clojurescript(甚至 clojure 本身)良好匹配的想法非常感兴趣。
你有什么理由认为增加 ns 轻量级别名分布式系统是一项坏事?

0

评论人:alexmiller

ns 已经承载了太多的功能,我们没有将它们做的更复杂。

0

评论者:bendlas

由于 ns 是 clojure 命名空间设置的基石,因此我可以想象修复(ns 承载过多的功能)这个问题需要进行一些相当激进的改动。由于我们将不会破坏 ns,因此我推测将是某种 ns2 或在 ns 条件之外设置命名空间的方式。无论如何,我都很好奇。

既然我知道Rich不会为他的 hammock time操之过急,我就先休息一下。在下一次 alpha 版发布时,我会确保回来看看。同时,我也希望有一些富有成效的讨论。

0

评论人:tslocke

有什么理由认为这种机制仅限于标识符?在代码的某个地方,它们对于具有该功能的符号来说也非常有用。

此外相关:为 pr-str(及其类似)提供一种配置方法以使用命名空间的小版本。带有命名空间映射的调试输出可能会非常嘈杂。

0

评论人:alexmiller

没有特别的原因——通常对于这类问题,我们使其对任何标识符(关键字或符号)保持一致。

0
参考:[https://clojure.atlassian.net/browse/CLJ-2123](https://clojure.atlassian.net/browse/CLJ-2123)(由 alexmiller 提出)
0

我们通过一对宏来解决这个问题。它们有点丑陋,但有效——我们已经使用它们大约四个月了,没有遇到任何问题。我们的团队对 Clojure 仍然比较新手,所以很想了解为什么这不是一个好主意...

(ns com.flexport.util.synthetic-ns
  "Synthetic namespaces are designed to be used as prefixes for namespace-qualified keywords.
  They allow us to decouple the names of data from the names of code.")

(defmacro def-synthetic-ns
  "Define a synthetic ns (the-ns), binding it to the-alias.

  Example:

  (def-synthetic-ns loan 'flexport.capital.loan)

  ::loan/name
  ;; flexport.capital.loan/name

  ::loan/id
  ;; flexport.capital.loan/id
  "

  [the-alias the-ns]
  `(do
     (def ~the-alias ~the-ns)
     (create-ns ~the-ns)
     (alias (quote ~the-alias) ~the-ns)))

(defmacro use-synthetic-ns
  "Use a synthetic ns alias defined elsewhere.

  Example:

  (ns ns-a
    (:require [com.flexport.util.synthetic-ns :refer [def-synthetic-ns]]))

  (def-synthetic-ns loan 'flexport.capital.loan)

  ::loan/a
  ;; flexport.capital.loan/a

  (ns ns-b
    (:require [com.flexport.capital.util.synthetic-ns :refer [use-synthetic-ns]])
    (:require [ns-a :as ns-a]))

  (use-synthetic-ns ns-a/loan loan)

  ::loan/b
  ;; flexport.capital.loan/b
  "

  [the-alias local-name]
  `(alias (quote ~local-name) (var-get #'~the-alias)))
...