clojure 返回 hello world 并且输出中没有任何内容

clojure returning hello world and nothing in the output

我刚开始学习 Clojure,我有自己的 Clojure 脚本,但它没有返回我希望的输出 (Hello World)。这是我的代码:

(ns com.playground.core
  (:gen-class))

(defn -main 
  [] 
  ((defn CHEESE
     []
     (str "Hello World"))

   (CHEESE)))

这是我在 REPL 中得到的输出:

clj꞉com.playground.core꞉> 
#'com.playground.core/-main

我想在输出中看到 Hello World

你有一个双括号。试试这个:

(defn -main
  []
  (defn CHEESE
    []
    (str "Hello World"))
  (CHEESE))

当然你必须调用 -main,否则你什么也看不到:

(defn -main
  []
  (defn CHEESE
    []
    (str "Hello World"))
  (CHEESE))
=> #'com.playground.core/-main
(-main)
=> "Hello World"

我看到你在另一个函数中定义了一个函数。为此,您应该使用 letletfn

为项目启动 REPL 不会 运行 -main运行 您的程序生成以下内容:

Execution error (ArityException) at com.playground.core/-main (core.clj:6).
Wrong number of args (1) passed to: com.playground.core/-main/CHEESE--177

发生了什么事?

  1. defn表单在名称下创建并注册一个函数 CHEESEcom.playground.core 命名空间中。
  2. defn 形成 returns 创建的 var,计算结果为 功能。
  3. 包含((defn ...) (CHEESE))的表格将CHEESE函数应用到 (CHEESE),没有计算 CHEESE 函数的结果 参数,
  4. ...这是字符串 "Hello World".

参数是什么并不重要,因为 CHEESE 没有 arity 1 调用:您不能将它应用于任何参数。

您可以通过从 -main 中拉出 CHEESEdefn 来更简单地获得相同的(坏的)效果。当我们这样做的时候,让我们删除没有效果的 str

(defn CHEESE []
  "Hello World")

(defn -main []
  (CHEESE (CHEESE)))

Execution error (ArityException) at com.playground.core/-main (core.clj:8).
Wrong number of args (1) passed to: com.playground.core/CHEESE

为了正确起见,我们只需删除 (CHEESE) 参数:

(defn -main []
  (CHEESE))

生产...

Process finished with exit code 0

没有返回值,但至少有 运行。但是如果我们在 REPL 中评估 (-main),...

(-main)
=> "Hello World"

那里。

其实,也不是完全错误。 这个return就是“声明的return”。

例如,您在 com.playground.core 命名空间中定义了一个 -main

return就是这个声明的符号#'com.playground.core/-main

要打印 Hello world 消息,您需要在声明后调用函数 CHEESE

所以...关于双括号,不好,但不影响嘿嘿。 还有一点就是函数名,也不好。考虑使用 kebab-case.

您还考虑更明确地保留函数声明。类似的东西;

(ns com.playground.core
  (:gen-class))

(defn CHEESE [] (str "Hello World"))

(defn -main []
  (CHEESE))

但也没有打印 Hello world。您只声明了一个 return 是字符串类型的函数 (CHEESE)。

要打印,需要调用打印函数。

(ns com.playground.core
  (:gen-class))

(defn hello [] (str "Hello World"))

(defn -main []
  (print (hello)))

我做了声明的演变以更好地解释

因此,您可以使用 let 替代方案和 threading macros

改进代码

考虑使用 https://kimh.github.io/clojure-by-example/ and https://tryclojure.org/ 来更好地理解这些选项:)