2024 Clojure 状态调查!分享您的看法。

欢迎!有关如何工作的更多信息,请参阅关于页面。

+2
Tools

问题

为程序入口点添加自定义行为是有用的。这类行为的示例
- 调用 (shutdown-agents) 以确保优雅关机;
- 为 JavaFX 应用程序调用 (Platform/exit) 以确保优雅关机;
- 在测试运行器中将 System/outSystem/err 反束,以收集所有输出。

使用 -M 风格入口点的 -main 函数是放置这些行为的自然位置。

这些行为的一个特性是,对于入口点来说可能非常有用,但它们以影响 JVM 的方式,使得这些程序可能无法被集成到长时间运行的程序中。

-X 可调用函数的情况是这个问题所在的地方,因为这些函数既应作为入口点使用,又应作为由依赖项用户调用的长时间运行的程序的部分使用,但是没有方法可以从函数内部区分它们。

考虑的解决方案

  1. 不做什么。库作者可以向他们的 -X 可调用函数添加可选参数来禁用特殊入口点行为,尽管这可能会在使用用户代码调用时以意外的断开方式破坏程序,使用户感到烦恼。库作者可以为启用特殊入口点行为而不是禁用它添加可选参数,但这使得命令行使用库变得更不方便。库作者可以为命令行和用户代码创建单独的 -X 可调用函数,但这样做减少了在代码和 CLI 中具有同一 API 的整个想法的实用性。
  2. clj-exec 可以给 -X 风格的调用添加一个额外的参数,表明它是作为入口点调用的,例如 clj -X clojure.core/prn :a 1 将打印 {:entry-point true :a 1}。我认为这种行为是不可预料的,可能会引起混淆,甚至让人烦恼。
  3. -X 可调用变量可以定义在作为入口点调用时将添加到参数中的元数据,例如
    (defn ^{:default-clj-exec-argmap {:rebind-system-err true}} do-stuff [argmap] ...)
    然后,运行 clj -X my.ns/do-stuff :other :args 将使用 {:rebind-system-err true} 作为默认 argmap,然后将其与其他参数合并。

1 个回答

0
图片加载失败

为什么不直接创建一个-Wrap函数,它封装一个更简单的函数呢?

...