我目前正在学习Clojure,而且我以前没有使用过任何Lisp方言。
所以,在做一个简单的图形用户界面测试时,我得到了一个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运行这段代码
发布于 2013-03-01 19:55:56
(defn -main [& args]
( (config! f :content "Hello world.")
(-> f pack! show!) ) )你的函数体周围有一组多余的括号。请比较以下内容:
(defn -main [& args]
(config! f :content "Hello world.")
(-> f pack! show!))发布于 2013-03-01 19:54:27
Seesaw没有包含在Clojure核心中,因此,就像在任何其他编程语言中一样,您需要将该库包含到您的项目中。使用Leiningen很容易-只需将[seesaw "x.y.z"] (其中"x.y.z“是版本)添加到您的project.clj。有关home page项目的更多详细信息和示例。
更新。我更关注你的异常和你的代码。您在以下行有一个错误:
( (config! f :content "Hello world.")与大多数其他语言不同,在Lisp中,方括号的作用比对参数进行分组更重要。当你写的时候:
(foo ...)foo应为function (IFn的实例)。因此,Clojure尝试将表达式(config! f :content "Hello world.")视为函数,但事实并非如此,因此会抛出异常。要修复它,只需删除额外的括号:
(defn -main [& args]
(config! f :content "Hello world.")
(-> f pack! show!))但是,请注意,在Clojure中顺序编写表达式并不总是可行的。通常情况下,您必须使用do一个接一个地执行几个操作。幸运的是,defn隐式包含do,因此不需要显式包含。
https://stackoverflow.com/questions/15156989
复制相似问题