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"
我看到你在另一个函数中定义了一个函数。为此,您应该使用 let
或 letfn
。
为项目启动 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
发生了什么事?
defn
表单在名称下创建并注册一个函数
CHEESE
在 com.playground.core
命名空间中。
defn
形成 returns 创建的 var,计算结果为
功能。
- 包含
((defn ...) (CHEESE))
的表格将CHEESE
函数应用到
(CHEESE)
,没有计算 CHEESE
函数的结果
参数,
- ...这是字符串
"Hello World"
.
参数是什么并不重要,因为 CHEESE
没有 arity 1 调用:您不能将它应用于任何参数。
您可以通过从 -main
中拉出 CHEESE
的 defn
来更简单地获得相同的(坏的)效果。当我们这样做的时候,让我们删除没有效果的 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/ 来更好地理解这些选项:)
我刚开始学习 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"
我看到你在另一个函数中定义了一个函数。为此,您应该使用 let
或 letfn
。
为项目启动 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
发生了什么事?
defn
表单在名称下创建并注册一个函数CHEESE
在com.playground.core
命名空间中。defn
形成 returns 创建的 var,计算结果为 功能。- 包含
((defn ...) (CHEESE))
的表格将CHEESE
函数应用到(CHEESE)
,没有计算CHEESE
函数的结果 参数, - ...这是字符串
"Hello World"
.
参数是什么并不重要,因为 CHEESE
没有 arity 1 调用:您不能将它应用于任何参数。
您可以通过从 -main
中拉出 CHEESE
的 defn
来更简单地获得相同的(坏的)效果。当我们这样做的时候,让我们删除没有效果的 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/ 来更好地理解这些选项:)