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}}仅在 Vars 上(并且只在该上)工作。

协议方法实际上是 Vars,所以上述网站更改有助于阐明如何 exports 这些方法。

剩余的 Vars 包括对 defrecord 和 deftype 合成生成的 map 和位置性工厂函数和构造函数。

或许可以接受一种变更,以便 {{(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 投票

评论者:vemv

嗨,Mike:

非常感谢您的澄清和处理!非常感激。

??^:export 仅在 Vars 上工作。?

在我看来,这段知识应该包含在文档中。为什么不把这个完整的故事放在一个地方讲述呢?

我最初提出这个问题是出于日志记录/调试。

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

那么,为了日志记录,我可能会尝试 {{(js/console.log (type the-instance))}},这样我就可以标识出例如一个有问题的组件。

但没有语言支持,无法在没有大量样板代码或者可能是一个笨拙的宏的情况下进行这样的操作。

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

0 投票
_评论由: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)

对于您的日志记录实例类型的例子,如果在 Node.js 下是 {{[Function: ze]}},那么当 {{:pseudo-names}} 启用时,您将得到 {{[Function: $my_ns$core$Foo$$]}}。

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

如果 {{:pseudo-names}} 满足这个票据的需求,那么这个票据也许可以被关闭。
0 投票
参考:[https://clojure.atlassian.net/browse/CLJS-2406](https://clojure.atlassian.net/browse/CLJS-2406)(由 alex+import 报告)
...