2024年Clojure现状调查!中分享您的想法。

欢迎!欲了解更多关于本站如何运作的信息,请参阅关于页面。

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

使用规范化的关键词很有用,尤其是与spec一起使用时。使用命名空间别名大量工作于规范化关键词很有帮助。然而,目前创建别名命名空间需要该命名空间实际存在。

此问题是一个占位符,用于对关键词的轻量级别名进行更多操作。细节待定。

以以下备注关闭: Clojure 1.11.0-alpha2 中的 `require` 支持 `:as-alias`。这就像 `:as` 创建了一个别名,但不会引起加载。有关详细信息,请参阅 CLJ-2123。

9个回答

0

评论者:bendlas

希望能在1.9-beta版本发布之前就开始这个话题的对话。

在我先前的ticket CLJ-2030中的合理依据是创建一个结构来允许在.cljc文件中的自动别名化,我希望将其作为一项需求提交。显然,在 cljs 中声明自动别名的位置是 ns 条款。
所以如果我们不希望在这个用例中扩展别名,我提议扩展ns条款以声明关键词别名。让我们给这个评论起一个暂定名字为(:kwns-alias ...)。

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

一个悬而未决的问题是,:kwns-alias应该如何与别名交互。即,::qualified/keyword 的命名空间是否应始终扩展到与 qualified/symbol 的同一位称,或者是否可以允许其有所不同。我会争论它们应该始终相同,因为简单的规则。这意味着,
-别名将需要检查sym是否已在:kwns-alias中,如果是,则抛出异常
-:kwns-alias还将需要处理`qualified/keywords可能不再需要在名称中出现ns了

那么给: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(由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)))
...