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}} 只在 (and only on) Vars 上 (有效)。

协议方法是 Vars,所以上述网站更改将有助于阐明如何导出它们。

考虑的剩余 Vars 将是地图和位置工厂函数以及为 {{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.map>Foo" my_ns.core.map>Foo)
(goog/exportSymbol "my_ns.core.#>Foo" my_ns.core.#>Foo)
`

0
by

评论由:vemv发起

嗨,Mike:

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

??^:export 只在 Vars 上工作(且仅限于此)??

我认为将此作为一个知识点包含在文档中会很不错。为什么不把整个故事放在一个地方讲述呢?

最初让我创建此问题的顾虑是日志记录/调试。

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

然后,为了日志记录,我可能会尝试执行 {{(js/console.log (type the-instance))}},以便识别例如有问题的组件。

但是,如果没有语言支持,无法轻松地实现这种情况(或者类似的情况),除非有大量的样板代码,或者可能是 hacky 宏。

能否在高级编译下使 {{(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 报告)
...