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}} 仅在变量上工作。

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

其他要考虑的变量包括为 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

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

我已经提出了对网站的修订:https://github.com/clojure/clojurescript-site/pull/150

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