我目前正在学习Clojure,以前从未使用过任何Lisp方言
因此,为了进行一个简单的GUI测试,我在seesaw中得到了一个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
运行此操作
(defn -main [& args]
( (config! f :content "Hello world.")
(-> f pack! show!) ) )
你的功能体周围有一组多余的parens。与以下内容进行比较:
(defn -main [& args]
(config! f :content "Hello world.")
(-> f pack! show!))
Seesaw没有包含在Clojure核心中,因此,与任何其他编程语言一样,您需要将此库包含在您的项目中。有了Leiningen,这很容易——只需将[seesaw "x.y.z"]
(其中"x.y.z"是版本(添加到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
,所以您不需要显式的。