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的命名空间是否应该始终扩展为与限定/symbol的命名空间相同,或者是否允许它们有所不同。我会争辩说它们应该始终相同,因为这符合简单性原则。这意味着
别名将需要检查符号是否已在:kwns-alias中,如果是则抛出异常。
- :kwns-alias还需要在`qualified/keywords`上工作,可能不再应该在名称中使用kwns。

那么:kwns-alias的好名字是什么?:let吗?

0
by

评论者:alexmiller

beta版本已特性完善,所以这个功能不会出现在1.9版本中。

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

0
by

评论者:bendlas

这很遗憾。但也许1.10版本会有更短的发布时间...

无论如何,我会非常关注Rich关于在ns之外执行此操作,但还要与clojurescript(甚至clojure)很好地配合的思路。
您有什么理由认为增长ns实现此功能是坏主意吗?

0
by

评论者:alexmiller

ns已经做了很多,我们也不希望让它做更多的事情。

0
by

评论者:bendlas

由于ns对clojure中的命名空间设置至关重要,我想一个针对该问题(ns做了太多)的解决方案将意味着对现有技术的剧烈改变。由于我们不希望破坏ns,我想可能会有某种ns2或者一种在ns条款之外设置命名空间的方法。对此我都很感兴趣。

既然我知道Rich不会对他的 hammock 时间感到困扰,我暂时就不追究这个问题了。我会确保在下一轮alpha版本发布时回来检查。同时,我也希望那时能有一些富有成效的讨论。

0
by

评论者:tslocke

这样的机制是否仅限于关键字?我的代码中有一个地方有这样一个 features 会对有帮助。

此外,相关内容:允许 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)))
...