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

シーソーは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 に答える