首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clojure返回hello world,输出中没有任何内容

clojure返回hello world,输出中没有任何内容
EN

Stack Overflow用户
提问于 2022-04-28 18:29:20
回答 3查看 97关注 0票数 0

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

代码语言:javascript
复制
(ns com.playground.core
  (:gen-class))

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

   (CHEESE)))

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

代码语言:javascript
复制
clj꞉com.playground.core꞉> 
#'com.playground.core/-main

我想在输出中看到Hello World

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-04-28 18:36:42

你在那里有两个括号。试试这个:

代码语言:javascript
复制
(defn -main
  []
  (defn CHEESE
    []
    (str "Hello World"))
  (CHEESE))

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

代码语言:javascript
复制
(defn -main
  []
  (defn CHEESE
    []
    (str "Hello World"))
  (CHEESE))
=> #'com.playground.core/-main
(-main)
=> "Hello World"

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

票数 1
EN

Stack Overflow用户

发布于 2022-05-02 09:37:36

为项目启动REPL不会运行-main。运行您的程序将产生以下结果:

代码语言:javascript
复制
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表单在com.playground.core命名空间中创建和注册一个名为CHEESE的函数。
  2. defn表单返回创建的var,它的计算结果是包含((defn ...) (CHEESE))表单的CHEESE函数应用于(CHEESE),这是计算CHEESE函数时没有参数的结果,H 216H 117.是字符串"Hello World".

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

通过将defn for CHEESE-main中提取出来,您可以获得同样的(坏的)效果。当我们完成这个任务时,让我们放弃str,它没有任何效果:

代码语言:javascript
复制
(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)参数:

代码语言:javascript
复制
(defn -main []
  (CHEESE))

生产..。

代码语言:javascript
复制
Process finished with exit code 0

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

代码语言:javascript
复制
(-main)
=> "Hello World"

那里。

票数 0
EN

Stack Overflow用户

发布于 2022-05-13 21:56:39

事实上,这并不是完全错误的。这种返回是“申报的返回”。

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

返回是此声明#'com.playground.core/-main的符号。

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

所以..。关于双括号,这不是好事,但不影响他。另一点是函数名,它也不好。考虑用烤肉串。

您还可以考虑更显式地保留函数声明。类似这样的事情;

代码语言:javascript
复制
(ns com.playground.core
  (:gen-class))

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

(defn -main []
  (CHEESE))

但同时你也没在打印“你好世界”。您只声明一个返回字符串类型的函数(奶酪)。

要打印,您需要调用一个打印函数。

代码语言:javascript
复制
(ns com.playground.core
  (:gen-class))

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

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

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

因此,可以使用let alternative和threading macros改进代码。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72048648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档