【问题标题】:Running .clj Clojure file with Leiningen使用 Leiningen 运行 .clj Clojure 文件
【发布时间】:2019-10-27 01:22:44
【问题描述】:

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

我已经安装了 Leiningen 并使用 lein new app 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:错误数量的 args (1) 传递给:my-stuff.core/sum

如果这是一个愚蠢的问题,我深表歉意,但是我将如何在 core.clj 中正确定义此函数?在单独的文件中定义它并从 core.clj 文件中引用它是否更有意义?

谢谢。

更新

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

【问题讨论】:

  • 我已经更新了我的答案,以解决您关于从另一个命名空间调用函数的问题。

标签: clojure leiningen


【解决方案1】:

我敢打赌有办法使用 Leiningen 创建一个独立的 .clj 文件,但我不知道它是什么。

我确实知道一种创建独立文件的方法,该文件结合了 bash 脚本和可执行的 clj 文件,只要系统安装了 Java 和 clj CLI 工具就可以运行 - https://clojure.org/guides/getting_started

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

这里是一个例子:https://github.com/jafingerhut/dotfiles/blob/master/bin/clj-check-added-metadata

【讨论】:

    【解决方案2】:

    没有愚蠢的问题! :-)

    让我们检查一下你定义的函数:

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

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

    让我们看看你是如何调用函数的:

      (sum [1 2])
    

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

      (sum 1 2)
    

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

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

    您可以通过在顶部的 ns 声明中使用 :require 指令来调用其他命名空间中的函数。

    假设我在utils.clj中有这个功能:

    (ns myapp.utils)
    
    (defn sum [a b]
      (+ a b))
    

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

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

    【讨论】:

    • 糟糕,我错过了。谢谢!
    猜你喜欢
    • 2013-09-22
    • 2011-12-01
    • 2020-07-26
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 2015-01-27
    相关资源
    最近更新 更多