gpt4 book ai didi

Clojure:在脚本中使用 *command-line-args* 而不是 REPL

转载 作者:行者123 更新时间:2023-12-04 06:53:11 25 4
gpt4 key购买 nike

我在 Eclipse 中运行了 clojure。我想在运行时将参数传递给 clojure。下面的参数在 REPL 中可用,但在脚本本身中不可用。我需要做什么才能在下面的 REPL 中键入 arg1 将返回第一个参数?

脚本:

(NS Test)
(def arg1 (nth *command-line-args* 0))

单击Eclipse“运行”后...
Clojure 1.1.0
1:1 user=> #<Namespace test>
1:2 test=> arg1
nil
1:3 test=> *command-line-args*
("bird" "dog" "cat" "pig")
1:4 test=> (def arg2 (nth *command-line-args* 1))
#'test/arg2
1:5 test=> arg2
"dog"
1:6 test=>

最佳答案

好像是你的 arg1*command-line-args* 之前定义得到一个值。 *command-line-args*clojure.core ,所以每个命名空间都应该能够看到它(除非你定义了一个命名空间并特别告诉它排除 core 或排除那个 var)。我不知道 Eclipse 如何启动 REPL 或者它如何/何时加载命名空间或用户代码,所以我不知道问题所在。

但是你可以转arg1成一个函数,然后它应该总是返回 *command-line-args* 的当前值(因为它将在运行时解析,并且 *command-line-args* 在您调用该函数时应该有一个值)。

(defn arg1 [] (nth *command-line-args* 0))

更好,如果 (nth *command-line-args* 0)输入本身真的很重要(我认为它不是,真的)你可以写一个更好的函数:
(defn ARGV [n] (nth *command-line-args* n))

然后使用 (ARGV 0) , (ARGV 1)等等。记住向量本身就是它们参数的函数,所以你可以很容易地做 (*command-line-args* n)直接(一旦你确定 *command-line-args* 不是 nil ;否则你会得到一个 NullPointerException。)

大量使用 def s 在顶层为事物分配名称在 Clojure 中通常不是惯用的。如果您想在本地引用命令行参数并暂时给它们一个较短的名称,则可以使用 let :
(defn foo []
(let [arg1 (nth *command-line-args* 0)]
...))

再次,这样 arg1应该在运行时获取它的值(每当你调用 foo 时),所以它应该可以工作。

关于Clojure:在脚本中使用 *command-line-args* 而不是 REPL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2832363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com