用户界面 - Clojure - "Exception in thread "主" java.lang.ClassCastException: seesaw.core.proxy"



我目前正在学习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,所以您不需要显式的。

相关内容

  • 没有找到相关文章

最新更新