2

我目前正在学习 Clojure,而且我之前没有使用过任何 Lisp 方言。
因此,尝试进行简单的 GUI 测试时,我在跷跷板上得到了 ClassCastException。

core.clj 文件:

(ns veg-gui.core)
(use 'seesaw.core)

(def f (frame :title "Hello world!") )


(defn -main [& args] 
  ( (config! f :content "Hello world.")
    (-> f pack! show!) ) )

完整的错误。

Exception in thread "main" java.lang.ClassCastException: seesaw.core.proxy$javax
.swing.JFrame$Tag$a79ba523 cannot be cast to clojure.lang.IFn
        at veg_gui.core$_main.doInvoke(core.clj:8)
        at clojure.lang.RestFn.invoke(RestFn.java:397)
        at clojure.lang.Var.invoke(Var.java:411)
        at user$eval5181.invoke(NO_SOURCE_FILE:1)
        at clojure.lang.Compiler.eval(Compiler.java:6511)
        at clojure.lang.Compiler.eval(Compiler.java:6501)
        at clojure.lang.Compiler.eval(Compiler.java:6477)
        at clojure.core$eval.invoke(core.clj:2797)
        at clojure.main$eval_opt.invoke(main.clj:297)
        at clojure.main$initialize.invoke(main.clj:316)
        at clojure.main$null_opt.invoke(main.clj:349)
        at clojure.main$main.doInvoke(main.clj:427)
        at clojure.lang.RestFn.invoke(RestFn.java:421)
        at clojure.lang.Var.invoke(Var.java:419)
        at clojure.lang.AFn.applyToHelper(AFn.java:163)
        at clojure.lang.Var.applyTo(Var.java:532)
        at clojure.main.main(main.java:37)

(另外,我正在运行这个lein run

4

2 回答 2

4
(defn -main [& args] 
  ( (config! f :content "Hello world.")
    (-> f pack! show!) ) )

你的函数体周围有一组多余的括号。与以下内容进行比较:

(defn -main [& args] 
  (config! f :content "Hello world.")
  (-> f pack! show!))
于 2013-03-01T11:55:55.547 回答
0

Seesaw 不包含在 Clojure 核心中,因此,与任何其他编程语言一样,您需要将此库包含到您的项目中。使用 Leiningen 非常简单 - 只需将[seesaw "x.y.z"](其中“xyz”是版本)添加到您的project.clj. 项目主页上的更多细节和示例。

UPD。我更加关注您的异常和您的代码。你有一个错误:

( (config! f :content "Hello world.")

与大多数其他语言不同,在 Lisp 中,括号比仅仅对参数进行分组更重要。当你写:

(foo ...)

foo预计是函数(的实例IFn)。因此,Clojure 试图将表达式(config! f :content "Hello world.")视为函数,但事实并非如此,因此会引发异常。要修复它,只需删除额外的括号:

(defn -main [& args] 
  (config! f :content "Hello world.")
  (-> f pack! show!))

但是请注意,在 Clojure 中按顺序编写表达式并不总是可行的。通常你必须使用do一个接一个地执行几个动作。幸运的是,隐式defn包含do,因此您不需要显式包含。

于 2013-03-01T11:54:26.750 回答