请在 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 上)工作。

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

考虑中的其他 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.map
(goog/exportSymbol "my_ns.core.
`

0
by

评论者:vemv

嗨,Mike,

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

??^:export 只在 (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$$]}},而不是例如 Node.js 下的 {{[Function: ze]}}。

我提出了对这个站点的修订:[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](https://clojure.atlassian.net/browse/CLJS-2406)(由 alex+import 报告)
...