使用 spacemacs 和 clojure 的 Hello World 应用程序错误 运行

Error running a Hello World app using spacemacs and clojure

(ns myname.myapp
  (:gen-class))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
   (println "Hello, World!"))

运行 "evaluate last sexpression" 与 (println "Hello, World!") 上的标记导致了以下错误:

Show: Project-Only All 
Hide: Clojure Java REPL Tooling Duplicates  (15 frames hidden)

2 Unhandled clojure.lang.Compiler$CompilerException
   Error compiling src/myname/myapp.clj at (0:0)
   #:clojure.error{:phase :compile-syntax-check,
                   :line 0,
                   :column 0,
                   :source "/Users/*/dev/myapp/src/myname/myapp.clj"}
             Compiler.java: 6808  clojure.lang.Compiler/analyze
             Compiler.java: 6745  clojure.lang.Compiler/analyze
             Compiler.java: 7181  clojure.lang.Compiler/eval
             Compiler.java: 7132  clojure.lang.Compiler/eval
                  core.clj: 3216  clojure.core/eval
                  core.clj: 3212  clojure.core/eval
    interruptible_eval.clj:   91  nrepl.middleware.interruptible-eval/evaluate/fn
                  main.clj:  437  clojure.main/repl/read-eval-print/fn
                  main.clj:  437  clojure.main/repl/read-eval-print
                  main.clj:  458  clojure.main/repl/fn
                  main.clj:  458  clojure.main/repl
                  main.clj:  368  clojure.main/repl
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  665  clojure.core/apply
                  core.clj:  660  clojure.core/apply
                regrow.clj:   20  refactor-nrepl.ns.slam.hound.regrow/wrap-clojure-repl/fn
               RestFn.java: 1523  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   84  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:   56  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:  155  nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
                  AFn.java:   22  clojure.lang.AFn/run
               session.clj:  190  nrepl.middleware.session/session-exec/main-loop/fn
               session.clj:  189  nrepl.middleware.session/session-exec/main-loop
                  AFn.java:   22  clojure.lang.AFn/run
               Thread.java:  832  java.lang.Thread/run
1 Caused by java.lang.RuntimeException
   Unable to resolve symbol: World! in this context

                 Util.java:  221  clojure.lang.Util/runtimeException
             Compiler.java: 7414  clojure.lang.Compiler/resolveIn
             Compiler.java: 7358  clojure.lang.Compiler/resolve
             Compiler.java: 7319  clojure.lang.Compiler/analyzeSymbol
             Compiler.java: 6768  clojure.lang.Compiler/analyze
             Compiler.java: 6745  clojure.lang.Compiler/analyze
             Compiler.java: 7181  clojure.lang.Compiler/eval
             Compiler.java: 7132  clojure.lang.Compiler/eval
                  core.clj: 3216  clojure.core/eval
                  core.clj: 3212  clojure.core/eval
    interruptible_eval.clj:   91  nrepl.middleware.interruptible-eval/evaluate/fn
                  main.clj:  437  clojure.main/repl/read-eval-print/fn
                  main.clj:  437  clojure.main/repl/read-eval-print
                  main.clj:  458  clojure.main/repl/fn
                  main.clj:  458  clojure.main/repl
                  main.clj:  368  clojure.main/repl
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  665  clojure.core/apply
                  core.clj:  660  clojure.core/apply
                regrow.clj:   20  refactor-nrepl.ns.slam.hound.regrow/wrap-clojure-repl/fn
               RestFn.java: 1523  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   84  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:   56  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:  155  nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
                  AFn.java:   22  clojure.lang.AFn/run
               session.clj:  190  nrepl.middleware.session/session-exec/main-loop/fn
               session.clj:  189  nrepl.middleware.session/session-exec/main-loop
                  AFn.java:   22  clojure.lang.AFn/run
               Thread.java:  832  java.lang.Thread/run

我该如何解决这个问题?

您对表单的评估出了点问题。此错误消息:

1 Caused by java.lang.RuntimeException
   Unable to resolve symbol: World! in this context

表示编译器看到的字符 World! 周围没有双引号,因此它会查找该名称的不存在变量。


开始使用 lein runlein test 到 run/test 您的代码可能更容易。您还可以克隆 this sample project,其中包含 lein-test-refresh 插件,它甚至比 repl 恕我直言更好。

我的猜测是您没有将光标放在要计算的表达式之后。 "Evaluate last sexp" 应该在您的光标刚好位于您要评估的表单之后时调用。

这里有一个更直观的解释。要使命令起作用,您的光标(表示为 |)应位于此处:

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
   (println "Hello, World!")|)

或此处:

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
   (println "Hello, World!"))|

您也可以尝试 "eval defun"("defun" 在 CIDER 的术语中表示顶级形式)或 "eval buffer"。对于 Clojure/Lisp 的新手来说,这些命令更容易使用。