【问题标题】:Is it possible to use :refer :all in a ClojureScript :require?是否可以在 ClojureScript :require 中使用 :refer :all ?
【发布时间】:2014-06-28 04:04:48
【问题描述】:

我只是在试用 ClojureScript,首先将我在 Clojure 中编写的内容转换为 cljx。

当我尝试编译它时,我得到:

clojure.lang.ExceptionInfo: :refer must be followed by a sequence of symbols in :require 

我在网上找到了一些间接引用,但没有地方说明我是否应该能够在 ClojureScript 程序中使用 :refer :all

如果我做不到,这个限制的原因是什么?

【问题讨论】:

    标签: clojure clojurescript cljx


    【解决方案1】:

    不,这是故意不可能的。 ClojureScript 邮件列表中最近有一个与:refer :all 相关的conversation,看起来它永远不会被支持。

    引用该线程中的 David Nolen 的话:

    这只是糟糕的风格,据我所知,它没有的唯一原因 Clojure 的改变是因为核心团队非常坚持 尽可能保持向后兼容性。明显的不足 的裸体 : 在 ClojureScript 中使用是故意的。

    【讨论】:

    • 有人能解释一下为什么它会是不好的风格吗?即使您可以看到低级函数和高级导出函数之间的自然划分,是否更喜欢拥有一个大名称空间而不是两个?
    • 裸 :use 或refer :all 的另一个问题是它引入了静态相分离。如果你现在执行(ns my-ns (:require foo.bar refer :all)),然后再添加 foo.bar/baz,你可能会与 my-ns 中已经定义的 baz 冲突。使用“all”意味着您必须能够枚举命名空间中声明的封闭列表,否则可能会冒超级混淆交互式和部分重新编译行为的风险。如果您有宏,这尤其成问题。
    • 这是一种糟糕的风格,因为当您尝试阅读和理解执行此操作的命名空间时,您无法分辨函数的来源。它还使您在重构、移动内容等时更难搜索和替换,因为您没有要查找的通用 ns 前缀。
    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    相关资源
    最近更新 更多