使用Leiningen运行.clj Clojure文件

时间:2019-10-27 01:22:44

标签: clojure leiningen

我最近开始学习Clojure,并且想知道是否存在执行简单.clj文件的标准方法。

我已经安装了Leiningen,并使用 lein新应用程序my-stuff 创建了我的第一个项目 my-stuff

要运行 my-stuff.core ,我从 lein run 开始:

user>lein run
Hello, World!

接下来,我尝试了 lein repl ,其次是:

user=> (require 'my-stuff.core)
nil
user=> (my-stuff.core/-main)
Hello, World!
nil 

我还使用 lein repl 进行了一些基本评估:

user=> (defn sum [x y] (+ x y))
#'user/sum
user=> (sum 1 2)
3

我尝试在 my-stuff.core 中定义此函数:

(ns my-stuff.core ((:gen-class))

(defn sum [x y] (+ x y))

(defn -main
  [& args]
  (sum [1 2]))

我收到以下错误: clojure.lang.ArityException:传递给:my-stuff.core / sum的args(1)的数量错误

很抱歉这是一个愚蠢的问题,但是我如何在 core.clj 中正确定义此功能?在一个单独的文件中定义它并从 core.clj 文件中引用它是否更有意义?

谢谢。

更新

如果该函数是在另一个.clj Clojure文件中定义的,那么声明名称空间以能够运行my-stuff项目中的代码的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

我敢肯定有几种方法可以使用Leiningen创建一个独立的.clj文件,但我不知道它是什么。

我确实知道一种创建独立文件的方法,该文件是bash脚本和可执行的clj文件的组合,并且只要系统安装了Java和clj CLI工具就可以运行-{{3} }

它也可以让您在与Clojure源代码相同的文件中指定依赖项,即使这些依赖关系不包含在Clojure本身的一部分中。

这里是一个示例:https://clojure.org/guides/getting_started

答案 1 :(得分:0)

没有愚蠢的问题! :-)

让我们检查一下您定义的功能:

(defn sum [x y] (+ x y))

此函数接受两个参数xy。在Clojure中,函数参数用方括号括起来,因为它有助于提高可读性。

让我们检查一下如何调用该函数:

  (sum [1 2])

在这里,您仅用一个参数调用函数sum,向量[1 2]就像一个2项数组。该错误试图告诉您:您正在调用一个带有两个参数的函数,但您只提供了一个。在这种情况下,您可以通过以下方式修复错误:

  (sum 1 2)

编辑:如果您在项目中创建了新的命名空间,如下所示:

src
└── myapp
    ├── core.clj
    └── utils.clj

您可以通过使用顶部:require声明中的ns指令从另一个命名空间调用函数。

假设我在utils.clj中具有此功能:

(ns myapp.utils)

(defn sum [a b]
  (+ a b))

然后您可以像这样从sum命名空间调用core

(ns myapp.core
  (:require [myapp.utils :refer [sum]]))

(defn -main
  [& args]
  (sum 1 2)) ;; call `sum` defined in the `myapp.utils` namespace