无法解析符号:此上下文中的示例 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 使用 longdouble 并且创建的变量将具有这些类型 - 您可以使用函数 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 ystr1 声明为全局的,这不是一个好的做法。

要仅在函数内部保留这些符号的上下文,您需要使用 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)