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/keywods 建立命名空间别名

一个开放的问题是如何::kwns-alias 应与别名交互。也就是说,:qualified/keyword 的命名空间是否应该始终与 qualified/symbol 的命名空间相同,或者是否应该允许它们不同。我认为它们应该始终相同,因为这遵循了简洁性的规则。这意味着:
- 别名需要检查 sym 是否已经在 :kwns-alias 中,如果是,则抛出异常
- :kwns-alias 还需要处理类似于 `qualified/keywords 的名称可能不再需要 knws 的名称了

那么: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 或在其他地方设置命名空间的方式。我对此都很好奇。

既然我知道 Rich 不会对他的 hammock 时间感到烦恼,我现在就不打扰他了。我会在下一轮 alpha 版本发布时回来看看。同时,我也希望在此期间有一些富有成效的讨论。

0

评论者:tslocke

有什么理由这样机制会局限于关键字吗?我在代码中有一个地方特别希望有这样的功能,可以用于符号。

同时,相关内容:让pr-str(及类似)能够配置使用命名空间短版本。即使是命名空间映射,调试输出也会非常嘈杂。

0

由:alexmiller 评论

没有特别的原因——通常我们会对任何标识符(关键字或符号)做同样的事情。

0
参考: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)))
...