2024 Clojure 状况调查! 中分享你的想法。

欢迎!请参阅 关于 页面以获取更多有关如何使用本站的信息。

0 投票
Dominic Monroe Clojure

我想运行 clojure -M -e "(compile 'foo.bar)" --some --args,其中 foo.bar 包含一些类似以下的代码:

(require (slurp (first *command-line-args*)))

这将动态地包含基于某些复杂列表的命名空间。

但是,上面的例子中 --some "丢失",clojure.main 尝试将其读作路径,因为没有方法可以“跳过”main-opt。我一直在使用 /dev/null 来欺骗它,这似乎有效。传统上使用 -- 来解决这个问题。

我摸索了 clojure.main 的源代码,似乎有一个“nil”选项,但没有文档说明,我也无法弄清楚如何激活它!

1 个答案

0 投票
alexmiller

我认为这超出了 clojure.main 尝试支持的范畴。你有多种方法,比如写一个 .clj 文件或一个 main,来解决这个问题。


修改
编写主文件或.clj文件的问题在于,脚本中的任何require都不会被编译。此问题也会影响通过"-i"加载的.clj文件。但是,`*command-line-args*`不正是为init opts读取参数而设计的吗?

~~在clojure.main这里似乎有一个bug:https://github.com/clojure/clojure/blob/30a36cbe0ef936e57ddba238b7fa6d58ee1cbdce/src/clj/clojure/main.clj#L558因为这个选项永远不会被触发。~~现在我明白为什么会这样了。真遗憾没有相邻的`"--"`,那样会更好。
...