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应该如何与别名交互,即是否::qualified/keyword的命名空间应始终扩展到与限定/符号的同一命名空间,或者应允许它们不同。我会争辩它们应该始终相同,因为简化规则。这意味着,
- 别名将需要检查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,或者在不使用 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)))
...