2024 Clojure 庞态调查问卷 中分享您的看法!

欢迎!请参阅 关于页面 了解更多如何使用本站的信息。

0
ClojureScript

^:export 看起来对 defrecord 没有影响 - 我只看到 Closure 发射了 def 和 defn 的原始符号。

我想,deftype、defprotocol 等也可能成为合理的目标。

无论如何,明确指出什么可行以及什么目前不可行(advanced-compilation.adoc),这样人们就不会盲目尝试。

6 个答案

0

评论者:mfikes

可以导出协议方法。建议的站点更改: https://github.com/clojure/clojurescript-site/pull/148

0
_评论者:mfikes_

{{^:export}} 在 Var 上(并且仅限于 Var 上)工作。

协议方法是 Var,因此上述站点更改将有助于阐明如何导出它们。

待考虑的其他 Var 将是 map 和位置工厂函数以及为 {{defrecord}} 和 {{deftype}} 生成的人工构造的构造函数。

或许可以接受一个更改,使得 {{(defrecord ^:export Foo [])}} 会导出 {{map->Foo}}、{{->Foo}} 和 {{Foo}}。同样,{{(deftype ^:export Bar [])}} 会导出 {{->Bar}} 和 {{Bar}}。
0

评论者:mfikes

绕行方案:使用 {{goog/exportSymbol}}

`
(ns my-ns.core)

(defrecord Foo [])
(goog/exportSymbol "my_ns.core.mapGT_Foo" my_ns.core.mapGT_Foo)
(goog/exportSymbol "my_ns.core.GT_Foo" my_ns.core.GT_Foo)
`

0
by

评论者:vemv

嗨,Mike,

非常感谢您澄清并处理这个问题!非常感谢。

??^:export 仅在 Vars 上工作(并且仅在 Vars 上工作)??

在我看来,这应该是一份很有价值的知识,可以包括在文档中。为什么不将整个故事集中在一个地方讲呢?

最初让我开启这个问题的原始关注点是日志记录/调试。

假设有一个应用程序有一系列 singleton defrecord 实例,作为组件系统(Sierra 风格)的一部分。

然后,为了进行日志记录,我可能会尝试 {{(js/console.log (type the-instance))}},这样我就可以识别如一个有缺陷的组件。

但没有语言支持,一个人除了大量的模板代码外,无法在没有很多样板代码或可能的黑客宏的情况下使其工作。

在高级编译时,能否让 {{(type some-instance-of-a-defrecord-or-deftype)}} 打印原始名称?

0
by
_评论者:mfikes_

嗨,Victor,

感谢对工单意图的澄清。{{\^:export}} 不是用于调试,而是用于让未命名的符号对 JavaScript 可用。实际上,它不会更改已重命名和优化的 JavaScript,而是简单地提供了额外的未命名的别名,这些别名指向优化/重命名的代码。(因此,通常,调试处理重命名/优化后的代码,即使在旁边有未命名的 {{^:exports}}。)

幸运的是,存在 {{:pseudo-names}} 来帮助调试优化后的代码:[https://script.clojure.org/reference/compiler-options#pseudo-names](https://script.clojure.org/reference/compiler-options#pseudo-names)

对于你的示例,涉及到记录实例的类型,如果{{:pseudo-names}}已启用,你将得到 {{[Function: $my_ns$core$Foo$$]}} 而不是例如 {{[Function: ze]}} (在 Node.js 下)。

我已经对该网站提出了修订:[https://github.com/clojure/clojurescript-site/pull/150](https://github.com/clojure/clojurescript-site/pull/150)

如果 {{:pseudo-names}} 满足这个工单的需求,也许这个工单可以关闭。
0
by
参考:https://clojure.atlassian.net/browse/CLJS-2406(由 alex+import 报告)
...