Clojure 在 repl 上加载文件并使用参数调用 -main

标签 clojure program-entry-point

我在 core.clj 中的 clojure 中完成了一些编码,其中有一个可以接受 0 个或多个参数的 -main 方法:

(defn -main
  "dequeue function"
   [& args]

我正在加载此 clj 文件:

(load-file "src/exercise/core.clj")

然后我尝试学习如何在 repl 中调用它以开发 core_test.clj (如果有任何关于如何开发此自动测试的提示,请也给我一些提示)。我现在想做的是:

(-main "resources\\sample-input.json" "a")

但是这是打印“Arguments 0”,这是我告诉代码打印的消息,只是为了查看传递了多少个参数

(println "Arguments" (count *command-line-args*))

我该怎么做? 谢谢!

最佳答案

i'm trying to learn how to call this within repl in order to develop core_test.clj

通常,您会编写从 -main 调用的其他函数并测试这些函数,而不是应用的入口点 -main

但是您应该能够像调用任何其他函数一样调用-main。我有一个 src/sandbox/main.clj 文件:

(ns sandbox.main)
(defn -main [& args]
  (prn args))

在项目文件夹中启动 REPL,我可以像这样调用 -main:

(use 'sandbox.main) ;; (load-file "src/sandbox/main.clj") also works
=> nil
(in-ns 'sandbox.main)
=> #object[clojure.lang.Namespace 0x67ccce04 "sandbox.main"]
(-main "some" "args")
;; ("some" "args")
=> nil

不过,我的示例有一个关键区别:它打印 -mainargs 绑定(bind); *command-line-args* 为零,因为您不是从带有 args 的命令行运行代码,而是从 REPL 运行它。

无论如何,使用 existing library to work with CLI args 可能是一个更好的主意。而不是直接*command-line-args*

关于Clojure 在 repl 上加载文件并使用参数调用 -main,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48858274/

相关文章:

java - "overriding"main 在 Java 中有什么作用?

clojure - 如何获取试剂中某个项目的索引

java - 适用于 Clojure Web 应用程序的良好 Web 服务器/Servlet 容器?

clojure - 为什么 CouchDB 使用仅追加的 B+ 树而不是 HAMT

java - 如何在 java 静态方法中扩展数据结构以使其变得惰性?

java - 构造函数与类的 main 方法中的断言语句背后的推理是什么?

c++ - 可以通过这种方式声明一个全局对象类吗?

clojure - Core.logic的简要说明

C++主要函数及程序

C 我不能打印一个整数,它在命令行中作为参数传递