Giter VIP home page Giter VIP logo

fx-clj's Introduction

Guide | API docs | Source | CHANGELOG | License

Clojars Project

Beta quality - the API is pretty stable and has gotten a fair amount of testing. JDK 8 and at least Clojure 1.7.0-alpha3 are required.

Overview

A Clojure library for JavaFX 8 with the following goals:

  • Provide convenience functions for creating and modifying JavaFX objects without attempting to completely hide the JavaFX API
  • Work with core.async out of the box
  • Provide support for creating JavaFX objects with both a function based - (fx/h-box (fx/button "Hello World")) - and hiccup-like API - (fx/compile-fx [:h-box [:button "Hello World"]]).
  • Provide an API for modifying nodes with selectors (sort of like enlive) for interacting with FXML resources
  • Allow for setting JavaFX CSS from code and integrate with the garden CSS library
  • Helper functions for i18n
  • Provide data binding to reactive atoms, cursors and expressions (via freactive.core).

Quick Start

Make sure you have installed JDK 8 and have lein configured to use it. See the leiningen sample.project.clj and search for LEIN_JAVA_CMD, :java-cmd and JAVA_CMD to see different ways to do this.

Add the leiningen dependency to your project listed above and a namespace declaration similar to the following to your code:

(ns my-ns
  (:require [fx-clj.core :as fx]))

A "hello world" example:

(ns example
  (:require [fx-clj.core :as fx]))

(defn create-view []
  (fx/h-box
    (fx/button {:on-action (fn [e] (println "Hello World!"))
                :text "Click Me!"})))

(fx/sandbox #'create-view) ;; Creates a "sandbox" JavaFX window to
                           ;; show the view. Clicking F5 in this
                           ;; window will refresh the view allowing the
                           ;; create-view function to be updated at the REPL

A quick example for integrating fx-clj and core.async:

(ns example2
  (:require [fx-clj.core :as fx])
  (:require [clojure.core.async :refer [chan go <! >!]]))

(defn create-view []
  (let [click-ch (chan)
        btn (fx/button :#my-btn {:on-action click-ch ;; You can bind a core.async channel directly to an event
                        :text "Next"})

        txt (fx/text "Initial text")
        view (fx/v-box txt btn)]
        
    (go
      (<! click-ch)
      (fx/run<! (fx/pset! txt "Next text"))
      (<! click-ch)
      (fx/run<!
        (fx/pset! txt "Last text")
        (fx/pset! btn {:text "Done"}))
      (println "Done listening to clicks"))

    view))

(fx/sandbox #'create-view)

Usage

Interacting with the JavaFX application thread

There are three macros for interacting with the JavaFX application thread - each providing slightly different asynchronous behavior: run!, run<! and run<!!. For those familiar with core.async, these correspond to the behavior of put!, <! and <!! respectively.

run! sends a block of code to be run asynchronously on the JavaFX application thread without blocking the caller. (It is effectively a thin wrapper around javafx.application.Platform/runLater.)

(run! (do-something)) ;; run asynchously without blocking

run<! can only be used in a core.async go block! It uses a core.async channel and <! to return the value of the code executed on the JavaFX application thread to the caller in the go block. (This blocks the go block, but does not block a thread.)

(go
    (let [res (run<! (do-something))] ;; Go block paused
        (println res)))

run<!! uses a core.async channel and <!! to return the value of the code executed on the JavaFX application thread. It blocks the calling thread until the block has completed and returns its value to the caller.

(let [res (run<!! (do-something))] ;; Calling thread blocked
    (println res)))

Modifying JavaFX objects

The pset! function is used to modify JavaFX objects.

The signature for pset! is the following:

(defn pset! [element id-class-keyword? property-map? content-or-children*])

id-class-kw? (optional): a keyword representing a hiccup style ID and classes (i.e. :#some-id.some-class.another-class).

property-map? (optional): a map of property keys and setters. Keys can be kebab-case keywords corresponding to JavaFX bean properties. Values are converted using clojurefx.core.convert/convert-arg. If a value is an instance of ObservableValue (or is converted to one), it will be bound to the property.

content-or-children* (zero or more): element or elements to be bound to the JavaFX element's DefaultProperty. If the DefaultProperty is a list property then multiple children elements can be bound, otherwise only a single 'content' element can be bound.

Creating JavaFX objects

There is both a function-based and hiccup-style API for creating JavaFX objects.

See the API documentation for fx-clj.core for a list of supported JavaFX objects.

The syntax for all object creation functions and the hiccup like vectors, is identical to the pset! syntax after the first argument (for the target element). Choosing between the different styles is basically a matter of preference. All of the following are equivalent:

(fx/button :#my-btn.my-class {:on-action (fn [] (println "Clicked"))} "Click Me")

(fx/compile-fx [:button#my-btn.my-class {:on-action (fn [] (println "Clicked"))}] "Click Me")

(fx/pset! (Button.) :#my-btn.my-class {:on-action (fn [] (println "Clicked"))} "Click Me")

Because the DefaultProperty of Button is text, it can be set by passing a single argument after the property map.

Elements can also be defined using FXML and modified with a selector-based transform (sort of like in enlive) using the at! function. Right now only ID-based selectors are supported. pset! based transforms are supported as well as a limited number of other transforms. See the test example.

Data Binding

The reactive atoms, expressions and cursors from freactive.core can be bound to any JavaFX property. Unfortunately not all of this capability is thoroughly documented - see the fx-clj.core.binding namespace (which is all pulled into fx-clj.core by potemkin) for more info.

License

Copyright © 2014 Aaron Craelius

Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.

fx-clj's People

Contributors

aaronc avatar odekopoon avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fx-clj's Issues

Make behavior more similar to cljs freactive: Reactively bind children nodes

I was trying to do the following just as an experiment within a function:

(defn create-view []
  (fx/compile-fx
    [:v-box
      (rx (if (= @view :web)
          [:web-view]
          [:button {:text "Click me!"}])])

(fx/sandbox #'create-view)

The exception I receive is:

Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: freactive.ReactiveExpression cannot be cast to javafx.scene.Node

Besides the differences in properties and tag names, something like this should work in the ClojureScript equivalent (e.g., with divs and buttons and the like). What needs to be done to make it work as in ClojureScript, i.e., by reactively binding children nodes to parent nodes as opposed to just properties to nodes?

property plugins ?

commit fa67cd7
sounds like a new and interesting feature

Could you provide any how-to/example for such a property-plugin ?

Application crashes when I click on another window.

When I run the ubjerar, the application always crashes when I click on some other window (e.g. change tabs on a browser, or double click on the terminal). It doesn't crash in dev mode. Here is the sample core.clj I'm using:

(ns my-fx.core
  (:gen-class)
  (:require [fx-clj.core :as fx]))

(def app-state (atom {:output-to   nil
                      :source-file nil}))

(defn create-grid []
  (let [grid              (fx/grid-pane {:alignment (javafx.geometry.Pos/CENTER)
                                         :hgap      10
                                         :vgap      10
                                         :padding   (javafx.geometry.Insets. 25 25 25 25)})
        text-field        (fx/text-field)
        label             (fx/label {:text "Your Message"})
        btn               (fx/button {:text "Say Hello"})
        dir-label         (fx/label {:text ""})
        dir-btn           (fx/button {:text "Choose directory"
                                      :on-action (fn [e]
                                                   (let [dir-c      (fx/pset! (javafx.stage.DirectoryChooser.))
                                                         output-dir (.showDialog dir-c (.getParent grid))]
                                                     (when output-dir
                                                       (swap! app-state assoc :output-to (.getAbsolutePath output-dir))
                                                       )))})
        file-chosen-label (fx/label {:text ""})
        file-choose-btn   (fx/button {:text "Choose file"
                                      :on-action (fn [e]
                                                   (let [file-chooser (fx/pset! (javafx.stage.FileChooser.))
                                                         file-chosen  (.showOpenDialog file-chooser (.getParent grid))]
                                                     (when file-chosen
                                                       (swap! app-state assoc :source-file file-chosen))))})]

    ;; Watch for changes to the application state.
    (add-watch app-state
               :app-state
               (fn [k a old-state new-state]
                 ;;Display the directory chosen where we want to save our file.
                 (when (:output-to new-state)
                   (fx/pset! dir-label {:text (:output-to new-state)}))
                 ;;Display the file we selected
                 (when (:source-file new-state)
                   (fx/pset! file-chosen-label {:text (.getCanonicalPath (:source-file new-state))}))))
    (.add grid label 0 1)
    (.add grid text-field 1 1)
    (.add grid dir-btn 0 2)
    (.add grid dir-label 1 2)
    (.add grid file-choose-btn 0 3)
    (.add grid file-chosen-label 1 3)
    (.add grid btn 1 5 2 2)
    grid))

(defn -main [& args]
  (fx/sandbox #'create-grid :title "My Fx"))

(comment
  (reset! app-state {:output-to nil
                     :source-file nil})
  (fx/sandbox #'create-grid :title "My Fx")
)

Question about using freactive

Sorry not sure where to ask this. Can you give me a quick example on how to bind to a control after the scene has been generated. I am using an fxml file to define the UI and I would like to bind to a labels text property using a cursor with an atom hashmap. I.e. state = {:label1 "this is the text"}.

CompilerException java.lang.NoClassDefFoundError: clojure/lang/IAtom

I fail requiring fx-clj.

nREPL server started on port 54838 on host 127.0.0.1 - nrepl://127.0.0.1:54838
REPL-y 0.3.5, nREPL 0.2.6
Clojure 1.6.0
Java HotSpot(TM) 64-Bit Server VM 1.8.0_25-b17
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e

sample.core=> (require '[fx-clj.core :as fx])

CompilerException java.lang.NoClassDefFoundError: clojure/lang/IAtom, compiling:(fx_clj/core/convert.clj:1:1) 
(defproject sample "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [enlive "1.1.5"]
                 [clj-http "1.0.1"]
                 [fx-clj "0.2.0-alpha1"]]
  :java-cmd "/home/delihiros/bin/jdk1.8.0_25/bin/java"
  :main sample.core)
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.1 LTS
Release:    14.04
Codename:   trusty

CompilerException clojure.lang.ExceptionInfo: Call to clojure.core/defn- did not conform to spec:

Using clojure 1.9.0 running

(require '[fx-clj.core :as fx])

gives this spec error

CompilerException clojure.lang.ExceptionInfo: Call to clojure.core/defn- did not conform to spec:

In: [0] val: clj-tuple/conj-tuple fails spec: :clojure.core.specs.alpha/defn-args at: [:args :name] predicate: simple-symbol?

 #:clojure.spec.alpha{:problems [{:path [:args :name], :pred clojure.core/simple-symbol?, :val clj-tuple/conj-tuple, :via [:clojure.core.specs.alpha/defn-args :clojure.core.specs.alpha/defn-args], :in [0]}], :spec #object[clojure.spec.alpha$regex_spec_impl$reify__2436 0x5fad62b5 "clojure.spec.alpha$regex_spec_impl$reify__2436@5fad62b5"], :value (clj-tuple/conj-tuple [t__16609__unified__ x__16610__unified__] (clojure.core/let [t__16609__unified__ t__16609__unified__] (clojure.core/case (.count t__16609__unified__) 0 (new Tuple1 x__16610__unified__ (clojure.core/meta t__16609__unified__)) 1 (new Tuple2 (. t__16609__unified__ e0) x__16610__unified__ (clojure.core/meta t__16609__unified__)) 2 (new Tuple3 (. t__16609__unified__ e0) (. t__16609__unified__ e1) x__16610__unified__ (clojure.core/meta t__16609__unified__)) 3 (new Tuple4 (. t__16609__unified__ e0) (. t__16609__unified__ e1) (. t__16609__unified__ e2) x__16610__unified__ (clojure.core/meta t__16609__unified__)) 4 (new Tuple5 (. t__16609__unified__ e0) (. t__16609__unified__ e1) (. t__16609__unified__ e2) (. t__16609__unified__ e3) x__16610__unified__ (clojure.core/meta t__16609__unified__)) 5 (new Tuple6 (. t__16609__unified__ e0) (. t__16609__unified__ e1) (. t__16609__unified__ e2) (. t__16609__unified__ e3) (. t__16609__unified__ e4) x__16610__unified__ (clojure.core/meta t__16609__unified__)) 6 (clojure.core/let [t__16609__unified__ t__16609__unified__] (clj_tuple.VectorSeq. 0 7 (clojure.core/-> [] clojure.core/transient (clojure.core/conj! (.nth t__16609__unified__ 0)) (clojure.core/conj! (.nth t__16609__unified__ 1)) (clojure.core/conj! (.nth t__16609__unified__ 2)) (clojure.core/conj! (.nth t__16609__unified__ 3)) (clojure.core/conj! (.nth t__16609__unified__ 4)) (clojure.core/conj! (.nth t__16609__unified__ 5)) (clojure.core/conj! x__16610__unified__) clojure.core/persistent!) (clojure.core/meta t__16609__unified__)))))), :args (clj-tuple/conj-tuple [t__16609__unified__ x__16610__unified__] (clojure.core/let [t__16609__unified__ t__16609__unified__] (clojure.core/case (.count t__16609__unified__) 0 (new Tuple1 x__16610__unified__ (clojure.core/meta t__16609__unified__)) 1 (new Tuple2 (. t__16609__unified__ e0) x__16610__unified__ (clojure.core/meta t__16609__unified__)) 2 (new Tuple3 (. t__16609__unified__ e0) (. t__16609__unified__ e1) x__16610__unified__ (clojure.core/meta t__16609__unified__)) 3 (new Tuple4 (. t__16609__unified__ e0) (. t__16609__unified__ e1) (. t__16609__unified__ e2) x__16610__unified__ (clojure.core/meta t__16609__unified__)) 4 (new Tuple5 (. t__16609__unified__ e0) (. t__16609__unified__ e1) (. t__16609__unified__ e2) (. t__16609__unified__ e3) x__16610__unified__ (clojure.core/meta t__16609__unified__)) 5 (new Tuple6 (. t__16609__unified__ e0) (. t__16609__unified__ e1) (. t__16609__unified__ e2) (. t__16609__unified__ e3) (. t__16609__unified__ e4) x__16610__unified__ (clojure.core/meta t__16609__unified__)) 6 (clojure.core/let [t__16609__unified__ t__16609__unified__] (clj_tuple.VectorSeq. 0 7 (clojure.core/-> [] clojure.core/transient (clojure.core/conj! (.nth t__16609__unified__ 0)) (clojure.core/conj! (.nth t__16609__unified__ 1)) (clojure.core/conj! (.nth t__16609__unified__ 2)) (clojure.core/conj! (.nth t__16609__unified__ 3)) (clojure.core/conj! (.nth t__16609__unified__ 4)) (clojure.core/conj! (.nth t__16609__unified__ 5)) (clojure.core/conj! x__16610__unified__) clojure.core/persistent!) (clojure.core/meta t__16609__unified__))))))}, compiling:(clj_tuple.clj:556:1) 

please tell if you want to help to sort this out! :)

Binding list

Hi
I know this is not done but perhaps I can ask anyway.
Was experimenting with table-view but got stuck on how to bind a list to the items property, is it supported yet?

Would expect to be able to have table-data in an atom and call something like (observable-list table-data :my-data) on it. Or perhaps use freactive cursors.

I got this far:

(def table-data (list {:name "Dan2" :age "high"} {:name "DanJ" :age "higher"}))
(fx/table-view {:columns [(fx/table-column {:text "Name"
                                               :cell-value-factory (fn [i] (fx/observable-property (.getValue i) :name))
                                               }) 
                             (fx/table-column {:text "Age"
                                               :cell-value-factory (fn [i] (fx/observable-property (.getValue i) :age))
                                               }) 
                             ]

                   :items table-data})

uberjar and compile

Anyone else has problems with uberjar and compile? It just won't complete.
I have to use a Runner class as a workaround and run my clojure code without AOT which results in long startup times when I run the jar file :(.

public class Runner {

  public static void main(String[] args) {
    clojure.lang.IFn require = clojure.java.api.Clojure.var("clojure.core", "require");
    require.invoke(clojure.lang.Symbol.intern("my-gui.core"));
    clojure.lang.IFn show = clojure.lang.RT.var("my-gui.core", "show");
    show.invoke();
  }
}
; ------------------------------------------------------
(ns my-gui.core
  (:require [fx-clj.core :as fx]))

(defn view []
  (fx/compile-fx ...........))

(defn show []
  (fx/sandbox #'view))
; ------------------------------------------------------
(defproject
  ... NO AOT
  :main Runner
  ...)

pset! keyword variant doesn't work

When giving id keyword to pset! the function doesn't use it to look for the node.

(fx/pset! element :#file-selection {:root (generate-file-menu)})

will manipulate element, instead of subelement with given id.

When keyword arg is given the function should work like the following:

(fx/pset! (fx/lookup view :#file-selection) {:root (generate-file-menu)})

Not a big deal, since workaround posted above works.

namespace 'clj-tuple' not found

I created a simple deps.edn file contains: {:deps {fx-clj {:mvn/version "0.2.0-alpha1"}}}.

I use Emacs CIDER command cider-jack-in. then (require '[fx-clj.core :as fx]). It reports error:

2. Unhandled clojure.lang.Compiler$CompilerException
   Error compiling potemkin/utils.clj at (1:1)
   #:clojure.error{:phase :compile-syntax-check,
                   :line 1,
                   :column 1,
                   :source "potemkin/utils.clj"}
                  core.clj: 5867  clojure.core/throw-if
                  core.clj: 5953  clojure.core/load-lib
                  core.clj: 5928  clojure.core/load-lib
               RestFn.java:  142  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 5985  clojure.core/load-libs
                  core.clj: 5969  clojure.core/load-libs
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  669  clojure.core/apply
                  core.clj: 6093  clojure.core/use
                  core.clj: 6093  clojure.core/use
               RestFn.java:  421  clojure.lang.RestFn/invoke
                 utils.clj:    1  potemkin.utils/eval19088/loading--auto--
                 utils.clj:    1  potemkin.utils/eval19088
                 utils.clj:    1  potemkin.utils/eval19088
             Compiler.java: 7177  clojure.lang.Compiler/eval
             Compiler.java: 7166  clojure.lang.Compiler/eval
             Compiler.java: 7636  clojure.lang.Compiler/load
                   RT.java:  381  clojure.lang.RT/loadResourceScript
                   RT.java:  372  clojure.lang.RT/loadResourceScript
                   RT.java:  459  clojure.lang.RT/load
                   RT.java:  424  clojure.lang.RT/load
                  core.clj: 6126  clojure.core/load/fn
                  core.clj: 6125  clojure.core/load
                  core.clj: 6109  clojure.core/load
               RestFn.java:  408  clojure.lang.RestFn/invoke
                  core.clj: 5908  clojure.core/load-one
                  core.clj: 5903  clojure.core/load-one
                  core.clj: 5948  clojure.core/load-lib/fn
                  core.clj: 5947  clojure.core/load-lib
                  core.clj: 5928  clojure.core/load-lib
               RestFn.java:  142  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 5989  clojure.core/load-libs
                  core.clj: 5969  clojure.core/load-libs
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 6007  clojure.core/require
                  core.clj: 6007  clojure.core/require
               RestFn.java:  408  clojure.lang.RestFn/invoke
              potemkin.clj:    1  potemkin/eval19082/loading--auto--
              potemkin.clj:    1  potemkin/eval19082
              potemkin.clj:    1  potemkin/eval19082
             Compiler.java: 7177  clojure.lang.Compiler/eval
             Compiler.java: 7166  clojure.lang.Compiler/eval
             Compiler.java: 7636  clojure.lang.Compiler/load
                   RT.java:  381  clojure.lang.RT/loadResourceScript
                   RT.java:  372  clojure.lang.RT/loadResourceScript
                   RT.java:  459  clojure.lang.RT/load
                   RT.java:  424  clojure.lang.RT/load
                  core.clj: 6126  clojure.core/load/fn
                  core.clj: 6125  clojure.core/load
                  core.clj: 6109  clojure.core/load
               RestFn.java:  408  clojure.lang.RestFn/invoke
                  core.clj: 5908  clojure.core/load-one
                  core.clj: 5903  clojure.core/load-one
                  core.clj: 5948  clojure.core/load-lib/fn
                  core.clj: 5947  clojure.core/load-lib
                  core.clj: 5928  clojure.core/load-lib
               RestFn.java:  142  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 5985  clojure.core/load-libs
                  core.clj: 5969  clojure.core/load-libs
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 6007  clojure.core/require
                  core.clj: 6007  clojure.core/require
               RestFn.java: 1523  clojure.lang.RestFn/invoke
                  core.clj:    1  fx-clj.core/eval19076/loading--auto--
                  core.clj:    1  fx-clj.core/eval19076
                  core.clj:    1  fx-clj.core/eval19076
             Compiler.java: 7177  clojure.lang.Compiler/eval
             Compiler.java: 7166  clojure.lang.Compiler/eval
             Compiler.java: 7636  clojure.lang.Compiler/load
                   RT.java:  381  clojure.lang.RT/loadResourceScript
                   RT.java:  372  clojure.lang.RT/loadResourceScript
                   RT.java:  459  clojure.lang.RT/load
                   RT.java:  424  clojure.lang.RT/load
                  core.clj: 6126  clojure.core/load/fn
                  core.clj: 6125  clojure.core/load
                  core.clj: 6109  clojure.core/load
               RestFn.java:  408  clojure.lang.RestFn/invoke
                  core.clj: 5908  clojure.core/load-one
                  core.clj: 5903  clojure.core/load-one
                  core.clj: 5948  clojure.core/load-lib/fn
                  core.clj: 5947  clojure.core/load-lib
                  core.clj: 5928  clojure.core/load-lib
               RestFn.java:  142  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 5985  clojure.core/load-libs
                  core.clj: 5969  clojure.core/load-libs
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 6007  clojure.core/require
                  core.clj: 6007  clojure.core/require
               RestFn.java:  408  clojure.lang.RestFn/invoke
                      REPL:    1  my-ns/eval19070/loading--auto--
                      REPL:    1  my-ns/eval19070
                      REPL:    1  my-ns/eval19070
             Compiler.java: 7177  clojure.lang.Compiler/eval
             Compiler.java: 7166  clojure.lang.Compiler/eval
             Compiler.java: 7132  clojure.lang.Compiler/eval
                  core.clj: 3214  clojure.core/eval
                  core.clj: 3210  clojure.core/eval
    interruptible_eval.clj:   82  nrepl.middleware.interruptible-eval/evaluate/fn/fn
                  AFn.java:  152  clojure.lang.AFn/applyToHelper
                  AFn.java:  144  clojure.lang.AFn/applyTo
                  core.clj:  665  clojure.core/apply
                  core.clj: 1973  clojure.core/with-bindings*
                  core.clj: 1973  clojure.core/with-bindings*
               RestFn.java:  425  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   82  nrepl.middleware.interruptible-eval/evaluate/fn
                  main.clj:  437  clojure.main/repl/read-eval-print/fn
                  main.clj:  437  clojure.main/repl/read-eval-print
                  main.clj:  458  clojure.main/repl/fn
                  main.clj:  458  clojure.main/repl
                  main.clj:  368  clojure.main/repl
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  665  clojure.core/apply
                  core.clj:  660  clojure.core/apply
                regrow.clj:   20  refactor-nrepl.ns.slam.hound.regrow/wrap-clojure-repl/fn
               RestFn.java: 1523  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   79  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:   56  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:  145  nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
                  AFn.java:   22  clojure.lang.AFn/run
               session.clj:  202  nrepl.middleware.session/session-exec/main-loop/fn
               session.clj:  201  nrepl.middleware.session/session-exec/main-loop
                  AFn.java:   22  clojure.lang.AFn/run
               Thread.java:  832  java.lang.Thread/run

1. Caused by java.lang.Exception
   namespace 'clj-tuple' not found

                  core.clj:  667  clojure.core/apply
                  core.clj: 5985  clojure.core/load-libs
                  core.clj: 5969  clojure.core/load-libs
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  669  clojure.core/apply
                  core.clj: 6093  clojure.core/use
                  core.clj: 6093  clojure.core/use
               RestFn.java:  421  clojure.lang.RestFn/invoke
                 utils.clj:    1  potemkin.utils/eval19088/loading--auto--
                 utils.clj:    1  potemkin.utils/eval19088
                 utils.clj:    1  potemkin.utils/eval19088
             Compiler.java: 7177  clojure.lang.Compiler/eval
             Compiler.java: 7166  clojure.lang.Compiler/eval
             Compiler.java: 7636  clojure.lang.Compiler/load
                   RT.java:  381  clojure.lang.RT/loadResourceScript
                   RT.java:  372  clojure.lang.RT/loadResourceScript
                   RT.java:  459  clojure.lang.RT/load
                   RT.java:  424  clojure.lang.RT/load
                  core.clj: 6126  clojure.core/load/fn
                  core.clj: 6125  clojure.core/load
                  core.clj: 6109  clojure.core/load
               RestFn.java:  408  clojure.lang.RestFn/invoke
                  core.clj: 5908  clojure.core/load-one
                  core.clj: 5903  clojure.core/load-one
                  core.clj: 5948  clojure.core/load-lib/fn
                  core.clj: 5947  clojure.core/load-lib
                  core.clj: 5928  clojure.core/load-lib
               RestFn.java:  142  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 5989  clojure.core/load-libs
                  core.clj: 5969  clojure.core/load-libs
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 6007  clojure.core/require
                  core.clj: 6007  clojure.core/require
               RestFn.java:  408  clojure.lang.RestFn/invoke
              potemkin.clj:    1  potemkin/eval19082/loading--auto--
              potemkin.clj:    1  potemkin/eval19082
              potemkin.clj:    1  potemkin/eval19082
             Compiler.java: 7177  clojure.lang.Compiler/eval
             Compiler.java: 7166  clojure.lang.Compiler/eval
             Compiler.java: 7636  clojure.lang.Compiler/load
                   RT.java:  381  clojure.lang.RT/loadResourceScript
                   RT.java:  372  clojure.lang.RT/loadResourceScript
                   RT.java:  459  clojure.lang.RT/load
                   RT.java:  424  clojure.lang.RT/load
                  core.clj: 6126  clojure.core/load/fn
                  core.clj: 6125  clojure.core/load
                  core.clj: 6109  clojure.core/load
               RestFn.java:  408  clojure.lang.RestFn/invoke
                  core.clj: 5908  clojure.core/load-one
                  core.clj: 5903  clojure.core/load-one
                  core.clj: 5948  clojure.core/load-lib/fn
                  core.clj: 5947  clojure.core/load-lib
                  core.clj: 5928  clojure.core/load-lib
               RestFn.java:  142  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 5985  clojure.core/load-libs
                  core.clj: 5969  clojure.core/load-libs
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 6007  clojure.core/require
                  core.clj: 6007  clojure.core/require
               RestFn.java: 1523  clojure.lang.RestFn/invoke
                  core.clj:    1  fx-clj.core/eval19076/loading--auto--
                  core.clj:    1  fx-clj.core/eval19076
                  core.clj:    1  fx-clj.core/eval19076
             Compiler.java: 7177  clojure.lang.Compiler/eval
             Compiler.java: 7166  clojure.lang.Compiler/eval
             Compiler.java: 7636  clojure.lang.Compiler/load
                   RT.java:  381  clojure.lang.RT/loadResourceScript
                   RT.java:  372  clojure.lang.RT/loadResourceScript
                   RT.java:  459  clojure.lang.RT/load
                   RT.java:  424  clojure.lang.RT/load
                  core.clj: 6126  clojure.core/load/fn
                  core.clj: 6125  clojure.core/load
                  core.clj: 6109  clojure.core/load
               RestFn.java:  408  clojure.lang.RestFn/invoke
                  core.clj: 5908  clojure.core/load-one
                  core.clj: 5903  clojure.core/load-one
                  core.clj: 5948  clojure.core/load-lib/fn
                  core.clj: 5947  clojure.core/load-lib
                  core.clj: 5928  clojure.core/load-lib
               RestFn.java:  142  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 5985  clojure.core/load-libs
                  core.clj: 5969  clojure.core/load-libs
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 6007  clojure.core/require
                  core.clj: 6007  clojure.core/require
               RestFn.java:  408  clojure.lang.RestFn/invoke
                      REPL:    1  my-ns/eval19070/loading--auto--
                      REPL:    1  my-ns/eval19070
                      REPL:    1  my-ns/eval19070
             Compiler.java: 7177  clojure.lang.Compiler/eval
             Compiler.java: 7166  clojure.lang.Compiler/eval
             Compiler.java: 7132  clojure.lang.Compiler/eval
                  core.clj: 3214  clojure.core/eval
                  core.clj: 3210  clojure.core/eval
    interruptible_eval.clj:   82  nrepl.middleware.interruptible-eval/evaluate/fn/fn
                  AFn.java:  152  clojure.lang.AFn/applyToHelper
                  AFn.java:  144  clojure.lang.AFn/applyTo
                  core.clj:  665  clojure.core/apply
                  core.clj: 1973  clojure.core/with-bindings*
                  core.clj: 1973  clojure.core/with-bindings*
               RestFn.java:  425  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   82  nrepl.middleware.interruptible-eval/evaluate/fn
                  main.clj:  437  clojure.main/repl/read-eval-print/fn
                  main.clj:  437  clojure.main/repl/read-eval-print
                  main.clj:  458  clojure.main/repl/fn
                  main.clj:  458  clojure.main/repl
                  main.clj:  368  clojure.main/repl
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  665  clojure.core/apply
                  core.clj:  660  clojure.core/apply
                regrow.clj:   20  refactor-nrepl.ns.slam.hound.regrow/wrap-clojure-repl/fn
               RestFn.java: 1523  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   79  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:   56  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:  145  nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
                  AFn.java:   22  clojure.lang.AFn/run
               session.clj:  202  nrepl.middleware.session/session-exec/main-loop/fn
               session.clj:  201  nrepl.middleware.session/session-exec/main-loop
                  AFn.java:   22  clojure.lang.AFn/run
               Thread.java:  832  java.lang.Thread/run
  • My java version:
    openjdk 14.0.1 2020-04-14
    OpenJDK Runtime Environment (build 14.0.1+7)
    OpenJDK 64-Bit Server VM (build 14.0.1+7, mixed mode)
  • My Clojure version: "1.10.1"
  • fx-clj version: "0.2.0-alpha1"

I tried to manually install library clj-tuple and potemkin. But not solved this problem.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.