# What do beginners struggle with?

**URL:** https://clojureverse.org/t/what-do-beginners-struggle-with/5383
**Category:** Beginners
**Created:** [January 22, 2020, 3:51pm UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383 "2020-01-22T15:51:21Z")
**Posts on this page:** 20
**Page:** 3

<div class="post-metadata">

### Author: ![dominikk](https://clojureverse.org/letter_avatar_proxy/v4/letter/d/85e7bf/32.png) [@dominikk](https://clojureverse.org/u/dominikk)
#### Post date: [March 6, 2020, 10:05am UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/41 "2020-03-06T10:05:23Z")

</div>

I’m probably in the second group (fp-beginner). I really only played around with CL, a colleague used it (that is a slight understatement, I think he would have controlled his household with CL but there’s just no interface for the dishes) and I really admired the productivity of his work. I just looked at CL, read a bit of Peter Seibel’s “practical common lisp” but never really implemented anything. A lack of spare time stood in the way of my ambitions then.

I think my struggles are not really different from most peoples who get in touch with fp: Thinking in recursive structures and not having digested a lot of the core functions and how they can be put to use. After all getting into fp feels a bit like someone is telling you to run the 100m and then suddenly switches of gravity. Some of your basic mechanisms just don’t work anymore 🙂  
In the case of “brave and true” my mistake was probably wanting too much too early. There is an exercise to implement the “comp” function at some point. After fiddling around for sometime not really getting anywhere you look at (source comp) and wonder if that is what you should have come up with. Since you didn’t, you assume that you probably haven’t really understood anything of the pages you worked through. That’s no really a encouraging experience.  
I need much more practice and my first-the-book-then-exercism approach was not the right one for me. For people with a bit more experience under their belt the book probably has the perfect tempo. It’s not cluttered, get’s to the point and shows you the elegance of the language.

Thank you all so much for your kind replies! I’ll have a look at the resources you provided.

---

<div class="post-metadata">

### Author: ![teodorlu](https://clojureverse.org/user_avatar/clojureverse.org/teodorlu/32/2896_2.png) [@teodorlu](https://clojureverse.org/u/teodorlu)
#### Post date: [March 6, 2020, 11:28am UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/42 "2020-03-06T11:28:10Z")

</div>

> [@dominikk](#):
>
> I guess it comes down to finding resources which not only teach the language but also the fundamental concepts of fp which are necessary to actually do something. Resources which don’t stop short at showing things but take the time to explain them.

I recommend @ericnormand’s book _Grokking Simplicity_. It sounds like what you’re looking for.

It uses JavaScript and not Clojure for its example. The author is a Clojure user, however, and following along in Clojure should not be a problem.

> **[Grokking Simplicity](https://www.manning.com/books/grokking-simplicity)**
>
> This practical guide will change the way you approach software design and development. It shows you how to write software that keeps complexity close to its inherent minimum.

---

<div class="post-metadata">

### Author: ![seancorfield](https://clojureverse.org/user_avatar/clojureverse.org/seancorfield/32/195_2.png) [@seancorfield](https://clojureverse.org/u/seancorfield)
#### Post date: [March 9, 2020, 12:35am UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/43 "2020-03-09T00:35:42Z")

</div>

> [@dominikk](#):
>
> After all getting into fp feels a bit like someone is telling you to run the 100m and then suddenly switches of gravity. Some of your basic mechanisms just don’t work anymore 🙂

This is such a great analogy! Yes, if someone is coming at FP from an OOP language and they find that there’s no traditional variables, no assignment, no encapsulation, no traditional loops (because there are no assignments and no variables)… that pulls the rug out from pretty much anything that they would intuitively try to use to solve most problems. It can be really tough to make that transition.

---

<div class="post-metadata">

### Author: ![chri](https://clojureverse.org/user_avatar/clojureverse.org/chri/32/2776_2.png) [@chri](https://clojureverse.org/u/chri)
#### Post date: [March 25, 2020, 7:56pm UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/44 "2020-03-25T19:56:57Z")

</div>

Ok, a couple of problems so far:

1. I’ve been setting up Atom (with parinfer, lisp-paredit, proto-repl, linter-joker, rainbow-delimiters, atom-beautify) [”apm install ink” results in an error].

The linter is looking at _each_ line of output in the repl — and complaining about the prompt, for example. I’ve disabled linter for now.

1. Installing libraries — the only instructions I’ve found so far say to put the library as a dependency in the project’s … file (and Leiningen will go and get it).

That’s weird. I was expecting something like “lein get whatever”. What if I don’t have a project? If I’m just playing in the repl? I don’t want to create/edit some file (with weird syntax).

1. Everyone in Clojureland appears to assume MacOS users use HomeBrew. What about MacPorts? ☹

2. Did I really just install go (the language) in order to install joker (a clojure interpreter/REPL) for the editor (atom) for a Lisp (clojure) [which has its own REPL]? 🙂

3. What is it with Lisp and modifier keys? I thought I was safe, by avoiding emacs, but now Atom wants me to do shift-alt-cmd-B to get the repl to evaluate the file I’m editing…

Guys! I grumble when I have to use even a _single_ modifier (I was happy when I learnt “gg” instead of “1G” in vim). Now I have to send my hands on a yoga course ☹ (You try typing shift-alt-cmd-B one-handed!)

1. None of the Clojure books I’ve read (skimmed) so far [CftBaT, JoC, PC3e] seems very interested in reading/writing files.

So this is my only serious problem: the documentation. (doc spit) says (spit f x &options) and says to look elsewhere for the options. That place doesn’t actually say what the options are. [Clojure-docs.org](http://Clojure-docs.org) has some _examples_ — but that’s not documentation (like a man page). Oracle java documentation has dozens of links about [java.IO](http://java.IO) — but that doesn’t tell me what the Clojure options for spit and slurp are…

I can ask the web, but watching a YouTube video or someone’s blog is … unsatisfying.

—-

So, that’s what I’ve struggled with so far. But I still like Clojure! 🙂

---

<div class="post-metadata">

### Author: ![didibus](https://clojureverse.org/user_avatar/clojureverse.org/didibus/32/951_2.png) [@didibus](https://clojureverse.org/u/didibus)
#### Post date: [March 25, 2020, 11:35pm UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/45 "2020-03-25T23:35:10Z")

</div>

> [@chri](#):
>
> I’ve been setting up Atom (with parinfer, lisp-paredit, proto-repl, linter-joker, rainbow-delimiters, atom-beautify) [”apm install ink” results in an error].

Hum, I think you’re just facing the reality that not all these Atom packages are well maintained. I know proto-repl isn’t anymore, and maybe linter-joker similarly isn’t? You should try Chlorine instead of proto-repl for Atom.

> [@chri](#):
>
> That’s weird. I was expecting something like “lein get whatever”. What if I don’t have a project? If I’m just playing in the repl? I don’t want to create/edit some file (with weird syntax)

The “weird” syntax is Clojure syntax 😋, once you learn Clojure it shouldn’t be weird anymore.

If you don’t have a project, you add your dependencies on your global lein user profile instead located at `~/.lein/profiles.clj`.

The doc isn’t great for lein to be honest. So this part is confusing. But you edit that file as such:

```auto
{:user {:plugins [[lein-pprint "1.1.1"]]
        :dependencies [[slamhound "1.3.1"]]}}

```

In the `:plugins` vector you add whatever global lein plugin you want to have. And in the `: dependencies` vector you add whatever library you want available globally.

Then anywhere you start a `lein repl` you’d have those dependencies available to you. And everywhere you run `lein` you’ll have the additional plugin features available to you.

If you use tools.deps instead of lein, aka, the `clj` command instead of the `lein` command. Then it is a bit different. You instead want to modify your `~/.clojure/deps.edn` file. Where you’d add dependencies there instead:

```auto
{:deps
 {clj-time {:mvn/version "0.14.2"}}}

```

So if you put the above in your user deps.edn whenever you run `clj` command the `clj-time` library will be available to you.

> [@chri](#):
>
> Did I really just install go (the language) in order to install joker (a clojure interpreter/REPL) for the editor (atom) for a Lisp (clojure) [which has its own REPL]? 🙂

Not really. You don’t need to install Go for Joker. Joker is implemented in go, but doesn’t require Go to run.

So what you did is install Joker, a Clojure dialect, implemented in Go, but not Go itself.

There’s actually a superior linter called clj-kondo, it lints against many more cases, though it’s not a superset of joker, there are a few things joker catches that clj-kondo doesn’t. I use both together. And that one is implemented in Clojure itself.

> [@chri](#):
>
> What is it with Lisp and modifier keys? I thought I was safe, by avoiding emacs, but now Atom wants me to do shift-alt-cmd-B to get the repl to evaluate the file I’m editing…

Hum… I think this leaks from Emacs. I’ve noticed this myself as well. But it’s also that other editors already take over the most common keybindings, so it’s hard to find available ones that don’t conflict. In Atom you should be able to customize them all to your liking.

If you know Vim, you can try using Vim-iced for Clojure.

> [@chri](#):
>
> None of the Clojure books I’ve read (skimmed) so far [CftBaT, JoC, PC3e] seems very interested in reading/writing files.

What do you mean? Like literally reading and writing to a file? That’s just one function: `spit` and `slurp`.

I would recommend you do the following:

1. Read through [Clojure by Example](https://kimh.github.io/clojure-by-example/#about)
2. Then read through [Clojure from the ground up: welcome](https://aphyr.com/posts/301-clojure-from-the-ground-up-welcome)
3. Then read through [Clojure - The Reader](https://clojure.org/reference/reader)
4. Now start referring to the Cheatsheet [Clojure - Cheatsheet](https://clojure.org/api/cheatsheet) and [clojuredocs.org](http://clojuredocs.org) and [cljdoc.org](http://cljdoc.org) for all other things
5. Finally, once in a while, read through guides here [Clojure - Getting Started](https://clojure.org/guides/getting_started)

---

<div class="post-metadata">

### Author: ![didibus](https://clojureverse.org/user_avatar/clojureverse.org/didibus/32/951_2.png) [@didibus](https://clojureverse.org/u/didibus)
#### Post date: [March 25, 2020, 11:56pm UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/46 "2020-03-25T23:56:05Z")

</div>

> [@chri](#):
>
> So this is my only serious problem: the documentation. (doc spit) says (spit f x &options) and says to look elsewhere for the options. That place doesn’t actually say what the options are. [Clojure-docs.org](http://Clojure-docs.org) has some _examples_ — but that’s not documentation (like a man page)

Oh ya, you make a great point about the doc for `spit`. There’s a few places like that where it is known that the doc is insufficient, or can be pretty compact and concise. I added a note to `clojuredocs.org` that specifies the valid options for spit. I think [clojuredocs.org](http://clojuredocs.org) is the best place to find “additional” doc. It’s not only examples, if you scroll past the examples, there are notes, where people can provide additional doc or tips.

Someone probably should sign the CA, make a patch to improve the doc, and all that, but most people don’t have time for that, so they either do nothing, or they add some examples or notes to [clojuredocs.org](http://clojuredocs.org) instead.

---

<div class="post-metadata">

### Author: ![chri](https://clojureverse.org/user_avatar/clojureverse.org/chri/32/2776_2.png) [@chri](https://clojureverse.org/u/chri)
#### Post date: [March 26, 2020, 12:15am UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/47 "2020-03-26T00:15:48Z")

</div>

Thanks didibus! That’s all really clear and helpful.

Regarding the IO, I actually meant the whole thing: buffered/unbuffered, seeking, appending, streams, pipes, reading a single character from STDIN etc.

Joy of Closure appears to have _one_ single call to (spit “file\_name” something). And not a single slurp (?!)

That’s not a criticism. I’m just surprised. (I’m used to C and Perl. And no Java …)

---

<div class="post-metadata">

### Author: ![didibus](https://clojureverse.org/user_avatar/clojureverse.org/didibus/32/951_2.png) [@didibus](https://clojureverse.org/u/didibus)
#### Post date: [March 26, 2020, 5:52am UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/48 "2020-03-26T05:52:33Z")

</div>

> [@chri](#):
>
> Regarding the IO, I actually meant the whole thing: buffered/unbuffered, seeking, appending, streams, pipes, reading a single character from STDIN etc.

Hum…, ya I guess I don’t know of any resource that goes in depth in all that.

I’d say the IO section in the [Cheatsheet](https://clojure.org/api/cheatsheet) probably has the most coverage of all that. Also, this chapter is pretty good: [4. Local I/O - Clojure Cookbook [Book]](https://www.oreilly.com/library/view/clojure-cookbook/9781449366384/ch04.html)

I guess, what you have to know is that everything is an InputStream or an OutputStream, which is a binary stream of bits. And then you have Writers and Readers, which operate over an InputStream or an OutputStream and do decoding/encoding of the bits for you in various ways depending on which one you use.

But ya, beyond that, IO in Clojure is really Java’s IO mechanism. So it can even help to search about that. And most IO doesn’t have Clojure functions for it either, but it is expected you just use interop for it.

You can find some docs on it here:

[https://docs.oracle.com/javase/8/docs/api/java/io/Reader.html](https://docs.oracle.com/javase/8/docs/api/java/io/Reader.html)  
[https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html](https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html)  
[https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html](https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html)  
[https://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html](https://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html)

So for example, `*in*` is the process input stream, its already made into a Reader, and to read the next char you can do:

```auto
(char (.read *in*))

```

You need to cast to char, since `.read` returns an int.

There’s various type of readers/writers and streams, some buffered, some unbuffered.

I’m not sure what seeking is. Appending is done with the option of `spit`. And for piping, you’d read from _in_ and output to _out_, for example:

```auto
#!/usr/local/bin/clojure

(->> (read-line)
     (take-while #(not= \s %))
     print)

```

That is thus a program that takes all input till \s and passes it to the next program:

```auto
% echo 123s456 | ./foo.clj | grep 2
(1 2 3)
   -

```

---

<div class="post-metadata">

### Author: ![mvarela](https://clojureverse.org/user_avatar/clojureverse.org/mvarela/32/1478_2.png) [@mvarela](https://clojureverse.org/u/mvarela)
#### Post date: [March 26, 2020, 7:16am UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/49 "2020-03-26T07:16:08Z")

</div>

> [@didibus](#):
>
> I’m not sure what seeking is.

Seeking is moving to a position in the file; say you want to read byte number 300 in the file, in C you’d use `fseek` (3) to position a cursor into the file, and then read or write from there.

In Java-land, that functionality is provided by [`RandomAccessFile`](https://docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html), so you should use that.

[This SO thread](https://stackoverflow.com/questions/7002156/how-to-correctly-read-from-randomaccessfile-in-clojure) has an idiomatic example.

---

<div class="post-metadata">

### Author: ![chri](https://clojureverse.org/user_avatar/clojureverse.org/chri/32/2776_2.png) [@chri](https://clojureverse.org/u/chri)
#### Post date: [March 26, 2020, 8:40am UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/50 "2020-03-26T08:40:53Z")

</div>

These are overly generous detailed and helpful answers 🙂 Much appreciated!

---

<div class="post-metadata">

### Author: ![taf](https://clojureverse.org/user_avatar/clojureverse.org/taf/32/2567_2.png) [@taf](https://clojureverse.org/u/taf)
#### Post date: [March 26, 2020, 8:57am UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/51 "2020-03-26T08:57:50Z")

</div>

now… the overall theme of this entire topic is “what do beginners strugge with” and i have already pointed out the shortcomings of the clj-doc-approach in a previous post.

having said that, i think a more fundamental difficulty for beginners arises as a consequence of clojure’s quintessence, namely, being a HOSTED LISP.

what do i mean? well, first of all, it is always easier to learn / master something new, if you are already familiar with something akin to it. for example, if you do already speak  
italian venturing into spanish will be much much easier for you than tackling japanese.

why? well because much of what you find in the spanish language is somewhat similar to what you already care and know about.

with japanese on the other hand everything!!! would be alien to you! instead of left-right-top-bottom people often write top-bottom-right-left, in addition to roman characters you get hiragana, katakana and last and most challenging chinese characters, instead of “normal” word order alla -bob likes lisp- you get -bob lisp likes-, no real grammatical number / gender…, counting… lets face it… counting is just a bloody mess, honorifics etc. etc.

…so… ultimately it really does come down to a different way of thinking… very much  
how imperative programming and functional programming is much more about different ways of thinking, rather than any specific programming language.

so:

> What’s in a name? That which we call a rose  
> By any other name would smell as sweet;

-----\> no! global state and mutation reeks!? 🙂

> **[How language shapes the way we think](https://www.ted.com/talks/lera_boroditsky_how_language_shapes_the_way_we_think/transcript?language=en)**
>
> There are about 7,000 languages spoken around the world -- and they all have different sounds, vocabularies and structures. But do they shape the way we think? Cognitive scientist Lera Boroditsky shares examples of language -- from an Aboriginal...

anyway…point is… learning about any lisp will be a major challenge, because of the unfamiliar syntax and programming concepts.

but it gets even worse! not only is clojure a lisp but a lisp hosted on the jvm!

the difficulty here is that, whenever something is hosted on something else… or providing an abstraction over something else, i am convinced that this really requires you to know about the host also… the abstraction alone does really not suffice!

for example, i have always found that the biggest problem with ORM is that people are using it without a proper understanding of the basic underlying RDB concepts.

so what i am saying is this: if you wanna learn about clojure you’d probably do well to learn some other lisp and java beforehand. ( same goes for js and cljs )

now if you look at my youtube channel you will find a programming tutorial consisting of 200 ( or so ) episodes discussing first emacs lisp, then urging the viewer to check out  
some java ( “effective java” etc. ) on her own… and ONLY THEN… ( having established those crucial foundations ) do i start discussing some basic clojure.

bottom line, getting to grips with clojure is super tough, but perhaps that’s also what’s making it fun… kinda 🙂

anyway… i am still struggling with clj myself,… but far from giving up!!! 🙂 in fact i got myself a sweet deal on the living clojure book… which has been recommended by seancorfield,… should arrive any day now 🙂

final remark and coming back to spoken languages,… obviously… - really this goes without saying -… obviously one can never fully / really master any language… native speaker / programmer or not… what with the infinite and ever evolving universe of subtleties, connotations, dialects, idiolects, idioms etc. etc.

p.s. not everything in life needs to / should gravitate around efficiency, pragmatism, practicality and ( sadly looming all too large all too often ) expediency!!!

> We’re losing about one language a week, and by some estimates, half of the world’s languages will be gone in the next hundred years.

---

<div class="post-metadata">

### Author: ![didibus](https://clojureverse.org/user_avatar/clojureverse.org/didibus/32/951_2.png) [@didibus](https://clojureverse.org/u/didibus)
#### Post date: [March 27, 2020, 5:18pm UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/52 "2020-03-27T17:18:41Z")

</div>

> [@mvarela](#):
>
> Seeking is moving to a position in the file; say you want to read byte number 300 in the file, in C you’d use `fseek` (3) to position a cursor into the file, and then read or write from there.

Ah okay. The link to Clojure cookbook covers that then [4. Local I/O - Clojure Cookbook [Book]](https://www.oreilly.com/library/view/clojure-cookbook/9781449366384/ch04.html) as well as memory mapped files.

---

<div class="post-metadata">

### Author: ![crispinb](https://clojureverse.org/user_avatar/clojureverse.org/crispinb/32/3486_2.png) [@crispinb](https://clojureverse.org/u/crispinb)
#### Post date: [March 30, 2020, 11:10am UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/53 "2020-03-30T11:10:30Z")

</div>

It’s week 2 of my clojure journey, so I fall flat-faced into the ‘beginner’ category. I have no prior experience with LISPS, but have done some work on the JVM (Java & a bit of kotlin), and am marginally exposed to functional concepts (albeit via javascript).

So far the actual Clojure coding I’ve done has been limited to exercises (4clojure, koans, exercism) and replicating bits and pieces from books (Living Clojure; Clojure for the Brave & True).

The only real language-level frustration I’ve had so far is just the generic fact of not knowing enough, particularly about the stdlib, to get any momentum. But constantly having to stop to look things up is a given learning any new language or platform.

I think the ‘problem’ of lispy syntax is way overblown, at least for experienced programmers. Once you’ve been coding for a few years, you’re mostly thinking in something nearer to AST’s than the surface-level syntax anyway, and it seems like a non-issue to me to move to a different syntactical structure.

So my main actual frustrations so far have been:

- re-arranging nested forms when I’ve got into a mess with one. This is totally self-inflicted. I ignored (good) advice not to start with paredit, and have more than once spent 10 minutes or so just trying to re-arrange something I’ve just stuffed up.
- not knowing what tools to use, eg. lein with project.clj vs clj with deps.edn. Options with the basics are not useful to a beginner
- not really understanding the relationship between the REPL and the code I’ve connected to it (in Emacs/Cider). Several times I’ve had errors I couldn’t fix, only to find the ‘same’ code worked in my next session. I assume I must have evaluated different groups of forms without quite following the implications
- compiler errors are often obtuse and hard for me to make use of. They’d be impossible if I had zero Java/JVM experience
- official Clojure API documentation tends to be terse and assumes a high level of familiarity with Clojure terminology (this is how it seems to a beginner, anyway).

I notice I’m not listing much there about the language itself, which actually seems rather clear, at least at the toy/puzzle level I’ve been inhabiting so far.

I’ve a feeling I’m going to hit a wall when I get to building real applications, lacking mental templates for the best way to arrange a bunch of functions so they don’t just form higher-level spaghetti architecture. I’ve asked around in a couple of places for excellent codebases (particularly whole apps) to use as exemplars, but haven’t come up with much. I’m wondering if there just might not be many high quality Clojure open source apps around. Still looking though.

---

<div class="post-metadata">

### Author: ![John\_Shaffer](https://clojureverse.org/user_avatar/clojureverse.org/john_shaffer/32/3192_2.png) [@John\_Shaffer](https://clojureverse.org/u/John_Shaffer)
#### Post date: [March 30, 2020, 2:53pm UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/54 "2020-03-30T14:53:20Z")

</div>

> I’ve a feeling I’m going to hit a wall when I get to building real applications, lacking mental templates for the best way to arrange a bunch of functions so they don’t just form higher-level spaghetti architecture. I’ve asked around in a couple of places for excellent codebases (particularly whole apps) to use as exemplars, but haven’t come up with much. I’m wondering if there just might not be many high quality Clojure open source apps around. Still looking though.

[mtgred/netrunner](https://github.com/mtgred/netrunner) is a good example of what a mature app looks like, although it is huge and probably pretty hard to get into. [seancorfield/usermanager-example](https://github.com/seancorfield/usermanager-example) seems to have the organization of a large project, but broken down into a manageable size for learning. These are both web apps, but it’s a pretty common pattern to have separate layers for storage/DB, presentation, and routing/startup.

---

<div class="post-metadata">

### Author: ![crispinb](https://clojureverse.org/user_avatar/clojureverse.org/crispinb/32/3486_2.png) [@crispinb](https://clojureverse.org/u/crispinb)
#### Post date: [March 30, 2020, 9:27pm UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/55 "2020-03-30T21:27:29Z")

</div>

Thanks for those suggestions @John_Shaffer - added to my (fast-growing) list of Clojure resources to go through.

---

<div class="post-metadata">

### Author: ![Erynvorn](https://clojureverse.org/user_avatar/clojureverse.org/erynvorn/32/311_2.png) [@Erynvorn](https://clojureverse.org/u/Erynvorn)
#### Post date: [May 19, 2020, 12:03pm UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/56 "2020-05-19T12:03:01Z")

</div>

Completely correct on the first point. I’m a beginner and I’ve no clue how to set up a proper basic clojure REPL environment. In Python, it takes one second to open the REPL. And my python REPL stays open for days until it crashes. I read LISP REPL can run forever but setting them up is a mystery 😉

---

<div class="post-metadata">

### Author: ![Erynvorn](https://clojureverse.org/user_avatar/clojureverse.org/erynvorn/32/311_2.png) [@Erynvorn](https://clojureverse.org/u/Erynvorn)
#### Post date: [May 19, 2020, 12:17pm UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/57 "2020-05-19T12:17:33Z")

</div>

Hi, setting up a simple Clojure REPL is the challenge for me.

My Python REPL is up and running for days in the background. Super simple to setup (no setup) and easy to use.

---

<div class="post-metadata">

### Author: ![orestis](https://clojureverse.org/user_avatar/clojureverse.org/orestis/32/279_2.png) [@orestis](https://clojureverse.org/u/orestis)
#### Post date: [May 19, 2020, 7:05pm UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/58 "2020-05-19T19:05:40Z")

</div>

Have you had a look at [https://clojure.org/guides/repl/introduction](https://clojure.org/guides/repl/introduction) ? It’s relatively recent and quite comprehensive.

---

<div class="post-metadata">

### Author: ![seancorfield](https://clojureverse.org/user_avatar/clojureverse.org/seancorfield/32/195_2.png) [@seancorfield](https://clojureverse.org/u/seancorfield)
#### Post date: [May 19, 2020, 9:25pm UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/59 "2020-05-19T21:25:53Z")

</div>

For the most part, folks just run `lein repl` (or `clj` if they’re using the new CLI/`deps.edn` but see the caveat below).

If you let Leiningen start a REPL, you can type into it – just like the Python “REPL” – and you can connect all Clojure-aware editors to it (`lein repl` tells you the port number its “nREPL Server” is running on and you can use `localhost` and that port number when connecting your editor to it. At that point, you can eval from your editor into the same REPL that you can also type directly into.

Caveat for CLI/`deps.edn`: unlike `lein repl`, this just starts a simple interactive REPL that you can type into. There are various ways to start other REPLs – see [https://github.com/seancorfield/dot-clojure/blob/master/deps.edn#L59](https://github.com/seancorfield/dot-clojure/blob/master/deps.edn#L59) for examples. I personally like to start a Socket REPL (`clj -A:socket`) since I use Atom/Chlorine which doesn’t need nREPL.

---

<div class="post-metadata">

### Author: ![Erynvorn](https://clojureverse.org/user_avatar/clojureverse.org/erynvorn/32/311_2.png) [@Erynvorn](https://clojureverse.org/u/Erynvorn)
#### Post date: [May 20, 2020, 1:10am UTC](https://clojureverse.org/t/what-do-beginners-struggle-with/5383/60 "2020-05-20T01:10:26Z")

</div>

I read the very well written guide. It is very clear.

I’ll need to install **correctly** homebrew, then a full-fledged flavor of Java, CLJ (or Leiningen) and set the right path and environment variables. I’ll give it a try. I never installed Java and that will be the first big challenge as homebrew seems to have an installer.

[Previous page](https://clojureverse.org/t/what-do-beginners-struggle-with/5383.md?page=2)

[Next page](https://clojureverse.org/t/what-do-beginners-struggle-with/5383.md?page=4)
