An example of clj execution
There is one good example of this sort of program in Clojure itself -
clojure.core.server/start-server, which can be used to start a socket server. Clojure users are probably most familiar with using the socket server to run a remote repl (but it can really be used to run any kind of socket server).
Looking closer at this function’s doc:
(doc clojure.core.server/start-server) ------------------------- clojure.core.server/start-server ([opts]) Start a socket server given the specified opts: :address Host or address, string, defaults to loopback address :port Port, integer, required :name Name, required :accept Namespaced symbol of the accept function to invoke, required :args Vector of args to pass to accept function :bind-err Bind *err* to socket out stream?, defaults to true :server-daemon Is server thread a daemon?, defaults to true :client-daemon Are client threads daemons?, defaults to true Returns server socket.
The Clojure tools now support the invocation of an ad hoc function using the -X parameter, and then a series of key value parameters. To invoke this function, it’s necessary to pass all of the required arguments (
:accept function) plus we need to set
:server-daemon to false to prevent the JVM from exiting:
clojure -X clojure.core.server/start-server :name '"server"' :port 5555 :accept clojure.core.server/repl :server-daemon false
Once the repl server has been started we can verify it’s working by connecting with netcat in a separate terminal:
nc localhost 5555 user=> (+ 1 1) 2
Of course, that’s a bit wordy on the command line and we mostly want all of those options every time so instead we can move those arguments into the deps.edn file:
And then we can just invoke the function via the args in the alias:
The execution mode also allows command line overrides of those parameters stored in the exec-args:
clojure -X:repl-server :port 5678
That’s it! This just seemed like a good quick example to understand how -X works…