无法解析符号:此上下文中的示例 clojure 1.10
Unable to resolve symbol: Example in this context clojure 1.10
我是 Clojure 的初学者,我在尝试用 Clojure 编写代码时收到此错误:
; Syntax error compiling at (src/com/playground/core.clj:17:1).
; Unable to resolve symbol: Example in this context
这是我的代码
(ns com.playground.core
(:gen-class))
;; This program displays Hello World
(defn Example []
;; The below code declares a integer variable
(def x 1)
;; The below code declares a float variable
(def y 1.25)
;; The below code declares a string variable
(def str1 "Hello")
(println x)
(println y)
(println str1))
(Example)
我直接从 tutorialspoint 中提取这个并试图找到其他有相同错误但找不到其他人的人。
我猜你没有评估那个功能。打开此项目的 REPL,评估 Example
的定义,然后评估 (Example)
.
正如您已经在评论中看到的那样,这段代码非常糟糕,您不应该从该教程中学习。但从初学者的角度来看,了解 究竟 有什么问题可能会有所帮助:
- 命名规则:函数名应该是dash-separated-lowercase-words,所以不是
Example
,而是example
.
- 已经提到
def
inside defn
. Def
creates a global variable, don't use it inside any other definitions. If you need to create some variables inside function, use let
。
- 整数变量和浮点变量。 Clojure 使用
long
和 double
并且创建的变量将具有这些类型 - 您可以使用函数 type
. 自行检查
- 重复
println
(it'll work, but you can also use clojure.string/join
with vector
且只有一次println
得到相同的结果)
改进代码:
(defn example []
(let [x 1
y 1.25
str1 "Hello"]
(println (clojure.string/join
"\n"
[x (type x) y (type y) str1]))))
(example)
=>
1
class java.lang.Long
1.25
class java.lang.Double
Hello
不能在函数内部声明定义。
您需要在外部声明这些符号(其他语言中的变量)。诸如此类。
(ns com.play
ground.core
(:gen-class))
(def x 1)
(def y 1.25)
(def str1 "Hello")
(defn Example []
(println x)
(println y)
(println str1))
(Example)
因此,当您这样做时,您将 x
y
和 str1
声明为全局的,这不是一个好的做法。
要仅在函数内部保留这些符号的上下文,您需要使用 let
方法。
(ns com.playground.core
(:gen-class))
(defn Example []
(let [x 1
y 1.25
str1 "Hello"]
(println x)
(println y)
(println str1)))
(Example)
一个额外的提示是避免使用 camel-case 作为声明命名的方式。
考虑使用 kebab-case :)
(ns com.playground.core
(:gen-class))
(defn example-function []
(let [x 1
y 1.25
str1 "Hello"]
(println x)
(println y)
(println str1)))
(example-function)
我是 Clojure 的初学者,我在尝试用 Clojure 编写代码时收到此错误:
; Syntax error compiling at (src/com/playground/core.clj:17:1).
; Unable to resolve symbol: Example in this context
这是我的代码
(ns com.playground.core
(:gen-class))
;; This program displays Hello World
(defn Example []
;; The below code declares a integer variable
(def x 1)
;; The below code declares a float variable
(def y 1.25)
;; The below code declares a string variable
(def str1 "Hello")
(println x)
(println y)
(println str1))
(Example)
我直接从 tutorialspoint 中提取这个并试图找到其他有相同错误但找不到其他人的人。
我猜你没有评估那个功能。打开此项目的 REPL,评估 Example
的定义,然后评估 (Example)
.
正如您已经在评论中看到的那样,这段代码非常糟糕,您不应该从该教程中学习。但从初学者的角度来看,了解 究竟 有什么问题可能会有所帮助:
- 命名规则:函数名应该是dash-separated-lowercase-words,所以不是
Example
,而是example
. - 已经提到
def
insidedefn
.Def
creates a global variable, don't use it inside any other definitions. If you need to create some variables inside function, uselet
。 - 整数变量和浮点变量。 Clojure 使用
long
和double
并且创建的变量将具有这些类型 - 您可以使用函数type
. 自行检查
- 重复
println
(it'll work, but you can also useclojure.string/join
withvector
且只有一次println
得到相同的结果)
改进代码:
(defn example []
(let [x 1
y 1.25
str1 "Hello"]
(println (clojure.string/join
"\n"
[x (type x) y (type y) str1]))))
(example)
=>
1
class java.lang.Long
1.25
class java.lang.Double
Hello
不能在函数内部声明定义。
您需要在外部声明这些符号(其他语言中的变量)。诸如此类。
(ns com.play
ground.core
(:gen-class))
(def x 1)
(def y 1.25)
(def str1 "Hello")
(defn Example []
(println x)
(println y)
(println str1))
(Example)
因此,当您这样做时,您将 x
y
和 str1
声明为全局的,这不是一个好的做法。
要仅在函数内部保留这些符号的上下文,您需要使用 let
方法。
(ns com.playground.core
(:gen-class))
(defn Example []
(let [x 1
y 1.25
str1 "Hello"]
(println x)
(println y)
(println str1)))
(Example)
一个额外的提示是避免使用 camel-case 作为声明命名的方式。 考虑使用 kebab-case :)
(ns com.playground.core
(:gen-class))
(defn example-function []
(let [x 1
y 1.25
str1 "Hello"]
(println x)
(println y)
(println str1)))
(example-function)