我最近开始学习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项目中的代码的正确方法是什么?
答案 0 :(得分:1)
我敢肯定有几种方法可以使用Leiningen创建一个独立的.clj文件,但我不知道它是什么。
我确实知道一种创建独立文件的方法,该文件是bash脚本和可执行的clj文件的组合,并且只要系统安装了Java和clj CLI工具就可以运行-{{3} }
它也可以让您在与Clojure源代码相同的文件中指定依赖项,即使这些依赖关系不包含在Clojure本身的一部分中。
答案 1 :(得分:0)
没有愚蠢的问题! :-)
让我们检查一下您定义的功能:
(defn sum [x y] (+ x y))
此函数接受两个参数x
和y
。在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