This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2019-06-26
Channels
- # announcements (6)
- # beginners (328)
- # boot (2)
- # cider (72)
- # clara (6)
- # cljdoc (4)
- # cljsrn (5)
- # clojure (78)
- # clojure-europe (3)
- # clojure-italy (22)
- # clojure-nl (4)
- # clojure-spec (3)
- # clojure-uk (114)
- # clojurescript (22)
- # clojurex (54)
- # copenhagen-clojurians (1)
- # core-async (20)
- # cursive (8)
- # data-science (1)
- # datomic (22)
- # duct (11)
- # emacs (32)
- # events (1)
- # figwheel (2)
- # fulcro (18)
- # graalvm (53)
- # graphql (39)
- # luminus (6)
- # nrepl (6)
- # off-topic (53)
- # om (1)
- # re-frame (8)
- # reagent (19)
- # reitit (3)
- # shadow-cljs (28)
- # spacemacs (10)
- # sql (37)
- # tools-deps (33)
- # vim (9)
- # xtdb (6)
How to download the lein for Windows files ?
I do not know if that is the correct link, but you could copy and paste that into a web browser and see
If it isn't, you can go to https://leiningen.org, find the 'install' section, and look for the link to the lein.bat Windows install script
How to download the file ?
Which file do I run ?
I think this is it. but it faulted
Do I need to put the .bat file into the other directory ?
@paulgureghian Do you have Java installed? What does java -version
print?
I think I just need to put 'lein' in the PATH first.
java is 1.8
Do I have I to make the lein.bat executable ? or is that only for the linux script ? .bat is already executable ?
I put 'lein' on the path and it still faults. # lein.bat Error: Could not find or load main class clojure.main
I just downloaded lein.bat
(right click > save link as... ) on a Windows machine that has Java but not Leiningen. When I ran lein.bat
it said I needed to self install, so I ran lein.bat self-install
and it set up Leiningen. Then lein.bat
prints out help, as I would expect.
Win 10 right ?
C:\Users\seanc>lein.bat
C:\Users\seanc\.lein\self-installs\leiningen-2.9.1-standalone.jar can not be found.
You can try running "lein self-install"
or change LEIN_JAR environment variable
or edit lein.bat to set appropriate LEIN_JAR path.
C:\Users\seanc>lein.bat self-install
Downloading Leiningen now...
C:\Users\seanc>lein.bat
Leiningen is a tool for working with Clojure projects.
Several tasks are available:
change Rewrite project.clj with f applied to the value at key-or-path.
check Check syntax and warn on reflection.
...
Yeah, Windows 10. I don't know why you get that message about not finding clojure.main
C:\Users\seanc>lein version
Leiningen 2.9.1 on Java 11.0.2 OpenJDK 64-Bit Server VM
C:\Users\seanc>java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.2+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.2+9, mixed mode)
Looks like I really need to upgrade my PS
I'm using cmd
for this, not Powershell.
I don't know whether the lein.bat
file will run in Powershell?
Can you try using cmd
instead and seeing if the lein.bat self-install
script will run there?
I think you might be right. I need a new method
actually im using con emu, and it tells me to upgrade PS
@seancorfield loved the memoized screencast. Using tap> at work and just fixed a bug in cider-nrepl with it. Quite handy
I think tap>
is great -- especially since REBL added the browse taps functionality!
yeah i'm tapping into the repl and into a sliding buffer of the last ten values. Need to get rebl hooked up with my environment soon
@deleted-user a debugging function added in Clojure 1.10.
@dpsutton And thanks for the kind words about the screencast 🙂
Even cmd.exe tells me to upgrade PS.
@paulgureghian You could follow the ZIP download advice. Go to this page https://github.com/technomancy/leiningen/releases/tag/2.9.1 and right click > save as on the .zip
link. Then extract the ZIP contents. Not sure what the next step is at that point tho'... [then rename it to a .jar
] possibly set the LEIN_JAR
environment variable to the path of that .jar
file
When I tried that way 'lein.bat' said to uninstall since it would do it itself.
I guess I need the PATH stuff
Ah, looks like that ZIP is the JAR file. I just renamed it (from .zip
to .jar
). So I downloaded the .zip
from the releases page, to my home folder. Renamed it to end in .jar
instead of .zip
. Then I edited my environment variables for my account so LEIN_JAR
was the full filesystem path to that .jar
file (in my case c:\users\seanc\leiningen-2.9.1-standalone.jar
) and, sure enough, lein.bat
was able to find it and run Leiningen for me.
@paulgureghian ^ maybe that will help
@dpsutton Yeah, I hadn't read it closely because "It Just Worked" for me without that. Good to know how it works in the non-installing case 🙂
How can a function be side-effectual and idempotent at same time? >Like halt-key!, suspend-key! should be both side-effectful and idempotent.
@ahmed1hsn A bit of context, perhaps? 🙂
Ah, I figured it would be something like Component... yes, in Component, both start
and stop
should be designed to be idempotent but they are (usually) side-effecting.
What it means is you can safely call suspend-key!
multiple times. It will apply its side effects as needed, but it can be called multiple times on a system.
In Component, what that means is that if you start
a system that has already been started, it will have no effect (the system remains started). When you call stop
, it will stop the system if it is running. If you call stop
on a stopped system, it will have no effect.
Does that help @ahmed1hsn?
@seancorfield Yeah. Thanks.
A concrete example: https://github.com/seancorfield/usermanager-example/blob/master/src/usermanager/main.clj#L140-L172
I am trying to render a simple graph with cljsjs.chartjs. I think I am sending data to graph in wrong way when i need to send a JS object shouldn't I send a map instead?
I'm not sure how the library works, but you could try passing it the js version of your opts (clj->js opts)
what is the latest data serialization you have used in your clojure project as curiosity question?
@papachan sure is. use a prefix when you jack in. If you're not familiar, jack-in is C-c M-j
and just add a C-u
right before it (that's the prefix). This will let you edit the jack in command
I dunno if anyone has used already the langohr rabbitmq library, I just ask in case somebody knows 😁 I'm trying to pass an argument to my handler function that I use to consumer subscribe
this works, but it is without args from message-handler
(lc/subscribe ch qe-name msg-handler {:auto-ack true})
so i would like to pass to
msg-handler
like an argument, but seeing the definition of the library, I can't find a way ( https://github.com/michaelklishin/langohr/blob/8506117cb7c29256f3d7e94dc8d510c7c0946fe0/src/clojure/langohr/consumers.clj#L86)reading the doc it says that it take a Clojure map of message metadata. But I don't know where I could modify this metadata to append my argument to the handler 😁
ok I might find out a workaround, I can define the handler via let
inside my function and then I can create it more or less dynamically
Hi, not sure if this is the best place to ask this, but I’ve got an issue deploying a compojure app. I’m using these routes:
(compojure/defroutes app
(-> (compojure/routes
(compojure/GET "/" [] (response/file-response "index.html" ))
(route/resources "/")
api/routes )
reload/wrap-reload))
In any case, I can run on localhost against an uberjar, and can load index.html as expected
But the same uberjar on my production server gives 404s for everything… except the API routes, which work perfectly
api/routes
@credulous
I also tried unzipping the jar on the production server and using the unzipped folder in the classpath
(defn resources
"Returns a route for serving resources on the classpath.
Accepts the following options:
:root
: the root prefix path of the resources, defaults to \"public\"
sudo java -cp unpacked/ clojure.main -m alexandria.core
is the command I used to run it… is that what you meant @ghadi?
the way I debug stuff like this is to load a repl and run the following:
(require '[ :as io])
(io/resource "public/js/main.js") ;; or whatever
Yes. Two resources for example: index.html and js/main.js - they exist both as unpacked/index.html and unpacked/public/index.html
Thanks… so I am getting nil when I just start a repl with clj
… sorry for the newb question, but how can I start a repl that has the same classpath as when I execute java -cp unpacked
?
I’m pretty sure I’ve heard of people attaching a repl to a running server, but that’s above my paygrade at the moment
^ when you look at that using java
or clj
or lein
, one of the root classpath directories will need to have a public
folder underneath it
When I run clj
is it modifying the classpath from the deps.edn
contained in the folder I run it from?
because my uberjar does not have the deps.edn in it. When I do what you describe above on localhost, (io/resource “js/main.js”) returns a URL, but only when I execute clj
from the project directory
note that compojure is looking for (io/resource “public/js/main.js”) not (io/resource “js/main.js”)
That will probably be my next hurdle. 😄 Right now, on the server, the classpath doesn’t contain anything project specific at all.
I’m puzzled though: when I run java -cp alexandria.jar
(or the unpacked directory) shouldn’t everything there be included in the classpath?
it's probably in the jar, in the wrong place @credulous
mkdir -p unpacked/public
touch unpacked/public/index.html
java -cp unpacked:$(clj -Spath) clojure.main
Clojure 1.10.1
user=> (require ')
nil
user=> ( "public/index.html")
#object[java.net.URL 0x2b4c1d96 "file:redacted"]
Having no real experience w/ Java web apps or JEE, what are the advantages of running a web app inside of an app server like Wildfly or Tomcat, as opposed to a standalone jar with an embedded http server?
So, like so many things: simple solution to my woes above: I was including a trailing slash in my classpath when using an unpacked jar file. No slash, no sorrow.
hey! I have a channel that is a kafka-consumer I want all those messages to be into a sequence
is it possible using atoms
You could do that but it doesn't seem like the most idiomatic way to do it in Clojure, IMO.
@javiergonzalez7 why do you want to put them in atoms vs. just processing the messages as the come off of the topic?
cus I want to use different threads for each message
You might want to give this a try: https://github.com/NovoLabs/gregor
yea been using kinsky but I think its not the way to go with this approach
Kinksy offers an async interface as well.
yep this method of processing messages is only going to be used for one source
In both cases, you get a channel, which you can then split.
not for the other ones since the message has a bulk of ids to be processed
instead of a single id message
I see. So you have 2 different "types" of messages on the topic?
one with a single id and one with a bulk load of ids?
@javiergonzalez7 I would assume 2 different handlers in that case as well, such that you only want one type of handler to see the single id messages and the other to see the bulk load messages?
Yea. So right now I have a channel with elements that are messages but I want to bulk them so I can do the bulk processing
cus i will have two different consumers for each method since the message schema is different
I was thinking of using a go loop to store all those elements into a sequence
and putting that sequence into a channel
If the messages are different on the topic (i.e. the bulk up
process is handled upstream by a producer) then you can use core.async/mult
to split the channel, piping the data to 2 different downstream channels. On the first, you can initialize it with a transducer that retains (using filter
) only the single id messages. The other channel could be initialized with a transducer that retains the bulk messages. I think that should work.
If you want to build up the bulk message from what is on the channel, that seems more challenging. Basically, that is a reduction to the channel and I'm not sure if that is possible on channels that never close (as would be the case with Kafka).
But I could be wrong about that. Definitely take with a grain of salt my word on what is and is not possible with async channels. 🙂
Thank you! I think the first one would be the best way
Hey all, I'm trying to import a local JAR in a Clojure project as a POC for Clojure-Java interop and am struggling with the process of getting the thing installed, naming, etc.... In Java, I have a class like:
package com.michael;
public class Interop {
public static int add(int a, int b) {
return a + b;
}
}
I created the ~/.m2
path for this using Leiningen via the project.clj by adding the dep [com.michael.interop/HelloWorld]
and move the jar into that directory, ~/.m2/repository/com/michael/interop/com.michael.interop/1.0.0
Still when I run any command run/deps/test
etc... I get the following error,
Could not find artifact com.michael.interop:HelloWorld:jar:1.0.0 in central ( )
Could not find artifact com.michael.interop:HelloWorld:jar:1.0.0 in clojars ( )
This could be due to a typo in :dependencies, file system permissions, or network issues.
If you are behind a proxy, try setting the 'http_proxy' environment variable.
you can use lein install
to put the jar and pom into the local cache
both files are needed
that directory path looks wrong - I'd expect ~/.m2/repository/com/michael/interop/1.0.0/
but lein install will put it in the right place
What exactly does the pom.xml need? Is it just there to manage dependencies? The actual java project I'll be importing is built using gradle so if I can integrate them without converting to maven that would be ideal
it needs the pom for transitive deps, yes - you should be able to generate a usable pom from gradle https://stackoverflow.com/a/17283856
but also, if you don't care about deps, lein install
can create a pom.xml that's minimal and sufficient iirc
I'm wrong, lein install needs an existing pom
You can also deploy arbitrary artifacts from disk:
$ lein deploy myrepo com.blueant/fancypants 1.0.1 fancypants.jar pom.xml
The repository can be defined in defproject or a profile, or it can be a URL.
Use file://$HOME/.m2/repository to install in the local repo.
(excerpt from lein help deploy
referenced from lein help install
)Hi all, I have a curiosity question. In your projects when do you have a configuration.edn file, how do you handle the load configuration data.edn to various program functions? I have seen in the wild differents patterns. Some projects use an atom where they load the conf.edn into atom and the pass it to different functions 'Currently I use a helper function where I just load the edn file and then use it in differents functions. (I call mostly the functions without any args) But with this take, I was thinking that I should pas the conf.edn as an argument to the various functions that need the conf, so I could abstract the fact that it is a edn'file and in future I could use conf as env variables. Etc
edn is a string format, so I'd definitely parse it and store it somewhere
I wouldn't use an atom, as it makes no sense to mutate config at runtime
putting it in a top level var should be fine, just access it from the namespace it's in
The question I had was also if I should pass the conf.edn or conf as an argument to a function of just don't pass it.. It is more a retrospective matter... But I was curious to see how other folks do
the .edn
means its a string - edn is a string format
if you mean the data object, sure, passing config as an argument makes sense
sadly I don't have a good open source example - I have open sourced libs but don't have a full fledged open source app
sure - I actually understand the slang but make the conscious choice to be pedantic about clojure terminology in this forum :D
it helps keep things clear
A bit easier to install Clojure than on Windows. is this verification enough before I use Clojure ?
@paulgureghian Looks good. Maybe run clojure -Sdescribe
just to double-check the clj
version (as opposed to the Clojure version) and verify the deps.edn
files it will search.
You should see something like this
(! 578)-> clj -Sdescribe
{:version "1.10.1.447"
:config-files ["/usr/local/Cellar/clojure/1.10.1.447/deps.edn" "/Users/sean/.clojure/deps.edn" ]
:install-dir "/usr/local/Cellar/clojure/1.10.1.447"
:config-dir "/Users/sean/.clojure"
:cache-dir "/Users/sean/.clojure/.cpcache"
:force false
:repro false
:resolve-aliases ""
:classpath-aliases ""
:jvm-aliases ""
:main-aliases ""
:all-aliases ""}
Yup. That's what I have
(I ran that in a folder that doesn't contain deps.edn
, else that would appear as the third item in :config-files
)
I ran it from Home
Looks like Clojure is an interpreted language
If I refer to a Clojure file as "source code file" instead of 'expression file", will I be tarred and feathered ?
I’ve never heard of an expression file
“source code” is standard usage
I saw it here : https://clojure.org/guides/learn/syntax
thinking it must just be a difference in what the file is being called when it says the unit of compilation is a clojure expression
Can I call the whole file (which holds expressions) a clojure source code file ?
when this matters is forward references: the compiler doesn't look ahead in the file to find definitions
I think you are tripping yourself reading a difference (what a file is called) where there is none
the difference is something else, when the clojure compiling generates bytecode, it does so for an expression at a time, not a file at a time, which has consequences elsewhere, but is also designed so to be the same as how the repl operates
a file is a file, a file full of source code is a source code file, source code is source code, etc
you have misunderstood the meaning and place where a distinction is being drawn there
i think you have your answer @paulgureghian 😂
Hi guys,
Quick question, what is the difference between clojure.jdbc\execute!
and clojure.jdbc\do-db-commands
, they seem to be very similar from just reading the docs
@slack1224 Do you mean clojure.java.jdbc
? clojure.jdbc
is a different library.
If you mean the former (the Contrib lib), the answer is that execute!
builds a PreparedStatement
first and may use .executeUpdate
or .executeBatch
, whereas do-db-commands
builds a Statement
instead and always uses .executeBatch
-- so execute!
can have SQL parameters but do-db-commands
cannot. TL;DR: use execute!
with SQL operations and do-db-commands
for DDL operations.
FWIW, the next generation of clojure.java.jdbc
is seancorfield/next.jdbc
and it no longer draws that distinction: execute!
can run both DDL and SQL and uses .execute
under the hood. Overall, next.jdbc
is simpler (and will usually be faster).
If I already have Clojure cli tools installed on a MAC, does it make sense to also install lein ?
It is not necessary to also install lein, but there should be no conflict between lein and the Clojure cli tools if you install them both.
I think many people have both installed on their machines, and alternate using them on different Clojure projects, as desired.
You may not want to try learning both of them simultaneously, when starting out.
I didn't see a list of recommended editors - extensions / IDEs for Clojure on the official site. I like Atom and VSC. good choices are they ?
I believe many people find those to be good choices for Clojure development.
I haven't used them myself, but don't take that as a vote against them.
There are people here who should be able to help you through just about any major editor choice you make, including setup recommendations. Most people would recommend that when starting out with a new language and dev tools, sticking with a familiar editor is probably going to be less frustrating.
i.e. one less unfamiliar thing to learn.
@paulgureghian I have used Atom for all my Clojure development for several years. I like it a lot. Both Atom and VS Code are fine, if you're used to them.
Me too. I don't want to deal with the learning curves of VIM and Emacs
And Sublime is not free
Don't like Notepad ++
This is the list of packages I have installed in Atom:
advanced-open-file
atom-clock
busy-signal
chlorine
git-plus
highlight-selected
ink
intentions
linter
linter-joker
linter-ui-default
lisp-paredit
parinfer
set-syntax
tool-bar
I don't use nREPL, I just use a Socket REPL (hence Chlorine), but I gather there's a nice, simple nREPL package for Atom?All that for Clojure ?
No, I just find they all make Atom easier to use for me.
If you're working with clj
/`clojure`, you can either start a Socket REPL to connect to with Chlorine, or an nREPL to connect to with the nrepl
package I believe?
I have 'language_clojure' in Atom.
Yes, that's built-in.
I highly recommend getting used to working with a REPL connected to your editor, so you can evaluate code directly in the editor. That makes you much more productive with Clojure.
Working from this : https://clojure.org/guides/repl/launching_a_basic_repl
How do you eval code in the editor ? don't I need to run the .clj file in the terminal ?
Work your way through all of that guide -- there's a lot of material in it.
Then this one : https://clojure.org/guides/repl/basic_usage
The guide has lots of pages. Go all the way through all of it.
If you're interested in using Chlorine with Atom for REPL integration, https://atom.io/packages/chlorine has some basic information that should get you up and running.
Is the same flow in other languages like Rust , Go in play here. create a source code file and run it either in an IDE or the terminal ?
No, Clojure really has a unique flow. The REPL is central to how we work, integrated into an editor.
We can run Clojure one expression at a time in the REPL (and from an editor) or we can load a whole file. In both cases, Clojure compiles expression as it reads it, then executes it.
For example, you can have a running Clojure application -- say a web app -- and use a Socket REPL to connect your editor to it and then run code inside the live, running application. That's usually how we work, to build an application. We have a very tight loop between writing a bit of code and running it, and we can build an application up in small pieces, evaluating each function as we write it into the running application.
Does Clojure have a dedicated shell ?
I don't know what you mean.
Like in Julia for example, I can use it in terminal, and I can also launch it in its own shell / interpreter
Actually terminal launches the Julia shell
Clojure doesn't have an interpreter. It is always compiled. But the compiler operates one expression at a time, just like the REPL.
The Clojure REPL is the "shell".
But the important point in Clojure is that it isn't separate, like other languages, and it isn't an interpreter.
like a notebook? there's gorilla-repl http://gorilla-repl.org/
Chlorine - Socket REPL client for Clojure and Clojure script ?
That's what I use.
Its just that when I think of expressions being evaluated, I think of interpreting rather than compiling
clojure compiles each expression as you go before running it
How do you compile one line ?
One expression. Not line.
user=> (* 2
13)
Clojure compiles that and runs it and the REPL prints 26
each top level expression that is - eg. a defn will contain multiple expressions inside it, but they are all compiled together
or (+ 2 13)
is three sub-expressions making up one compound expression, technically
You do not need to do anything special to cause one "top level" Clojure expression to be compiled. It is compiled automatically, just before it is evaluated.
but the clojure compiler doesn't compile until there's a full top level form consumed (so you can leave it hanging if there's invalid input but you haven't given a closing brace for example)
The compiler creates the compiled version in the memory of the running Java process, usually without writing anything to disk anywhere. (There is an option to write out a compiled version to disk, but no need to ever do that at all)
As far as it appears to you, you can't tell the difference between interpreted or compiled, except it runs faster than it would if it were being interpreted.
So, it doesn't create an executable ?
If you want to create an artifact that can be deployed and run elsewhere, you can build a JAR file, which can be run via java
.
(that's the same as Scala, Kotlin, Java itself)
Is that the way most Clojurians operate ?
for development we use the repl, and then we make a jar to deploy and run with java on the remote host
Development (and often testing) is all done via the REPL or just running clojure
(or lein
or boot
). Deployment to QA/CI/Production/whatever can be done via source code (Datomic Ions works that way I believe?) but is most commonly done by packaging the Clojure code into a .jar
file and then running it via the java
command.
Andy said that there is no need to ever write out a compiled version ?
you can create and run the jar without compiling beforehand
At work, we create .jar
files using the depstar
library for clj
/`clojure` and then we run those .jar
files with
java -cp path/to/the.jar clojure.main -m entry.point
where entry.point
is whatever namespace contains the -main
we want to run.(we package up Clojure code as source in the .jar
and then when it is run, the Clojure runtime compiles that source on the fly before it executed)
Strictly speaking, the .jar
files we create are a mix of our Clojure source code, the compiled Clojure runtime (which includes the compiler BTW), and all the libraries that the code will need to run -- Java libraries, Clojure libraries...
What languages are direct competitors of Clojure ? compiled or interpreted ?
JVM languages are all compiled, including Clojure.
Some of those languages have a separate interpreter -- even Java has a "shell" now -- but those interpreters are usually not full-featured and/or have all sorts of restrictions on what they can do.
Like JIT compilers ?
the vm itself does the jit
So all JVM languages can take advantage of that.
the jit is bytecode in, bytecode out, it doesn't operate on higher level code
What languages have you programmed in before @paulgureghian? Maybe it'll help if we can relate aspects of Clojure/JVM to your past experience.
Python, Javs for Android, Rust, Go,
Some R
Well, the JVM jit is JVM bytecode in, native code out
( Clojure, Java, Scala, Kotlin, etc ) compile source code to JVM bytecode; the JVM runs that bytecode and is technically an interpreter but it also has a JIT compiler that progressively turns "hot" parts of that (interpreted) bytecode to native code as it runs. So pretty much everyone calls JVM-based languages "compiled" -- much like C#/F#/etc are compiled to CLR bytecode.
I would think that any sufficiently high level programming language is a "competitor" to Clojure, e.g. Python, Ruby, JavaScript, etc., in terms of some of the features they offer a developer for rapid feature development.
Just wondering why Clojure would call for openjdk instead of oracle java ?
Clojure works just fine on the Oracle JVM.
What gave you the impression that Clojure calls for openjdk?
I think I saw it in the official Clojure install instructions
Hmm, I can't find any mention of Oracle's JDK on http://clojure.org -- pretty much everything just sort of assumes you already have a JVM installed. I guess the assumption is that if you're trying Clojure, you already know it's a JVM-based language and you know what that entails...?
Which JVM you choose is entirely up to you -- and based on licensing issues.
Clojure itself is tested on both OracleJDKs and OpenJDKs https://build.clojure.org/job/clojure-test-matrix/
If anyone warned you against the Oracle JDK, my guess is that would be based more on recent Oracle license changes for its JDK, rather than any other reason.
openj9 is also a thing (open sourced from the ibm jvm code), and amazon has their own jvm (I think it is just their packaging of openjdk), both of which run clojure
And another thing that I have been pondering. why the name 'Clojure' /. what is the origin of this name ?
Rich explained that in this 2009 mailing list post https://groups.google.com/forum/#!msg/clojure/4uDxeOS8pwY/UHiYp7p1a3YJ
(took me a while to track down that -- it probably ought to be added to the FAQ on the main site...)
Richard Hickey ?
Yes. Sorry, most people here just refer to him as "Rich" as if he's the only one 🙂
"BDFL - Rich Hickey is the creator and Benevolent Dictator for Life of what goes into Clojure." -- https://www.clojure.org/dev/workflow#_groups 🙂
Its open source, but there is still some oversight
Strong oversight -- the language is very carefully designed and evolves very deliberately. It's what makes Clojure so stable across all of its versions (and why it's reasonable to run alpha/beta releases of Clojure itself in production, as we do at work).
Using Java and the Clojure JAR If you have downloaded and built Clojure, you can use Java to launch a Clojure REPL: java -jar clojure.jar You should see output like the following: Clojure 1.9.0 user=>
This means you installed Clojure from source ?
ok. I dont think thats what I did
You may choose to build Clojure from source code and create your own jar file, but most people download a pre-built JAR file from the Maven Central site. All of the dev tools Leiningen, boot, Maven, and deps/clj/clojure can download JARs for Clojure and many other libraries for you, once you tell it what kinds of JARs you want in your project.
(if you build it from source, you can create a single JAR -- which is what that page talks about, although it should probably be updated to show Clojure 1.10.1 since that's what you'll get if you build it from source these days) [Pull request submitted]
Ah, it's mentioned at the bottom of this page https://clojure.org/guides/repl/launching_a_basic_repl#_using_java_and_the_clojure_jar and links to this https://clojure.org/guides/getting_started#_other_ways_to_run_clojure