The big barrier for me with emacs was discovering and then remembering
all of the various finger-bending chords to do things. Spacemacs uses
hydra so all the key mappings are grouped in a very logical way. Have
a read of http://spacemacs.org, particularly the horizontal image
slide show.

But yeah, spacemacs was a breath of fresh air - and if you like vim it
gets even better :-).

On 11 January 2017 at 20:09, ahawk <aho...@gmail.com> wrote:
> Thanks a lot for the very elaborate reply.
>
> I should probably buy SICP.
>
> With regards to discovery, I will have a closer look at clojure.spec. It
> looks interesting. I've previously (perhaps wrongfully) discarded Prismatic
> Schema, thinking something like "don't you really just want static types?"
> (which is apparently not the case according to this background info:
> http://plumatic.github.io/schema-for-clojurescript-data-shape-declaration-and-validation/).
> Anyway, some of these libraries seem like they try to mix Clojure with ideas
> derived from other languages. I would like to learn to develop Clojure
> productively in an idiomatic way.
>
> With regards to developer tools, spacemacs seems interesting. What do you
> mean by keymap discoverability?
>
> Den søndag den 8. januar 2017 kl. 10.52.55 UTC+1 skrev Colin Yates:
>>
>> Hi ahawk and welcome to Clojure!
>>
>> Your question seems to cover multiple domains:
>>  - navigating/discovery in non-statically typed languages, specifically
>> Clojure
>>  - developing in Clojure
>>  - developer tools (e.g. IDE for Clojure)
>>
>> (I can feel a stream of consciousness/ramble coming so so this might
>> take a while; settle in ;-)).
>>
>> [discovery]
>> Clojure apps tend to prefer data over functions, so the data itself
>> becomes part of the API. The notion of 'it's just a map' is very
>> prevalent. How is that addressed? Well, it typically comes down to:
>>  - ad-hoc documentation of the shapes
>>  - pre/post conditions (not very scalable but works OOTB)
>>  - Plumatic (previously known as Prismatic) Schema became the de-facto
>> standard for describing and asserting conformity to a given shape at
>> runtime
>>  - core.typed was an attempt to apply static typing that could be
>> validated as a compilation step. I am not sure it was as wildly
>> successful in terms of implementation as it was as an intriguing
>> possibility?
>>  - core.spec - a new, blessed and very exciting part of Clojure v1.9
>> which promises to bring the power of Clojure to creating 'specs' that
>> your data but follow. It also has the very neat trick of producing
>> generators (for property based testing) from those specs. I haven't
>> used this in anger, but like all the best things Clojure it promises
>> to bring simplicity to a previously complex and convoluted space. Very
>> interested to see how this plays out.
>>
>> None of that addressed your question of "how do I know what to expect"
>> _unless_ the tool author has documented it. I would expect more and
>> more libraries to ship with Clojure specs over time (although there is
>> some controversy over this).
>>
>> The other common thing to expect is lots of data-driven unit tests
>> which can also document your code. Clojure's preference of pure forms
>> makes this much more feasible.
>>
>> You mention looking at the source, yeah, that is another assumed tool
>> developers will employ. The nice thing is that Clojure, being such a
>> 'small' language has quite a low barrier to entry so reading other's
>> source code becomes quite efficient quite quickly.
>>
>> Unfortunately, the lack of a blessed code style and the rush of OO
>> developers moving to Clojure _without_ reading SICP (yeah, I'm talking
>> about me) means some of the code might make your eyes bleed.
>>
>> [developing in Clojure]
>> Briefly:
>>  - data over forms
>>  - no global state/pure forms
>>  - REPL, REPL and more REPL
>>
>> Rich Hickey did a great talk about 'systems' development rather than
>> 'function' (that isn't right but I can't remember the exact phrasing)
>> development where in LISP you build a living system made up of lots of
>> living components. In other languages you build chunks of code.
>>
>> This mindset, coupled with the desire for 'pure' forms makes the REPL
>> an indispensable and incredibly powerful tool.
>>
>> In other languages (e.g. Java) you don't have a living system, you
>> have a bunch of small chunks of code and you frequently start/stop
>> that system. In Clojure you start the REPL once and then build the
>> system over time. That won't make sense until it does :-).
>>
>> Yeah, there is much more I could write about this but it is long enough
>>
>> [developer tools]
>> If you are an emacs developer then CIDER and clj-refactor is an
>> incredibly powerful toolset. If you haven't already looked then
>> checkout spacemacs as well, just for the keymap discoverability if
>> nothing else.
>>
>> Cursive an IntelliJ plugin is also fantastic and brings a lot of the
>> power of IntelliJ to Clojure. Code navigation, refactoring etc. Colin
>> (Flemming) has done a _great_ job.
>>
>> I, like a bunch of people I expect do both. I use space macs 90% of
>> the time and then occasionally throw the project into Cursive to find
>> unused code and other polishings.
>>
>> You could live in exclusively emacs or Cursive perfectly happily, but
>> both brings to spoils I think. There are a bunch of other IDEish
>> tools; NightCode, CounterClockwise etc. I lost track since finding
>> spacemacs ;-).
>>
>> Both tools will let you debug although to be honest, I haven't needed
>> to use a debugger in the 5+ years I have been contorting Clojure. In a
>> large part, because of the succinctness and small footprint of the
>> language, 'pure' forms and common idioms (sequences, sequences and
>> more sequences) you end up with a very small toolset which is
>> amazingly powerful.
>>
>> Other essential tools are either leiningen or boot. Leiningen is the
>> 'old guard' whereas boot is the newer one. Both are actively
>> maintained and developed but have different mindsets. Leiningen is
>> similar to maven; 'declare your project' and plugins use that
>> declaration as a source of truth. Boot is more like gradle, it is just
>> another Clojure program. <flame suit>Boot looks like the more flexible
>> but if you don't need that flexibility then leiningen will get you
>> started quicker </flame suit>
>>
>> [Summary]
>> If you are still reading this then congrats :-).
>>
>> If you are new to LISP then SICP is a must. To get used to Clojure:
>>  - go and watch almost all of Rich Hickey's videos
>>  - get used to REPL development
>>  - get used to reading source code
>>  - go and read the core docs, almost everything you need is there.
>> Zippers are also more useful than you might think.
>>  - go and read the core docs again
>>  - pure forms changing data rather than a blob of code offering
>> functionality. Although old,
>>
>> http://thinkrelevance.com/blog/2009/08/12/rifle-oriented-programming-with-clojure-2
>> is still a great read here
>>
>> here endeth the ramble.
>>
>> On 8 January 2017 at 07:47, ahawk <aho...@gmail.com> wrote:
>> > Hi everyone
>> >
>> > I am a rather unexperienced Clojure user, so please bear with me.
>> >
>> > I am developing a web app using popular libraries such as ring,
>> > compojure,
>> > liberator and friend to handle routing, content negotiation and
>> > authentication. There is quite a lot of map manipulation going on with
>> > the
>> > request and response maps. To me, as an unexperienced Clojure user, the
>> > content of these maps is not very transparent as I code. What I am
>> > trying to
>> > say is that I find it difficult to know exactly what to expect from
>> > these
>> > libraries and many other, unless, of course, I read and understand their
>> > source. That is a challenge in its own right for a less advanced
>> > programmer
>> > such as myself.
>> >
>> > I am using various Emacs packages for productivity (see below), and
>> > while
>> > they are very helpful, the code is still not as transparent to me as a
>> > strongly typed language, where the IDE shows you exactly what type of
>> > data a
>> > function returns. Part of the problem is probably that I am only using a
>> > fraction of the functionality that these plugins provide or don't use
>> > the
>> > functionality properly:
>> >
>> > clojure-mode
>> > cider
>> > paredit
>> > rainbow-delimiters
>> > rainbow-mode
>> > eldoc
>> > web-mode
>> > clj-refactor
>> >
>> > Questions:
>> > Based on the above, could you perhaps suggest any functionality in these
>> > or
>> > other packages, which could make the interaction (in lack of a better
>> > word)
>> > with other libraries more transparent to me?
>> >
>> > Also, can you tell me if it is possible to debug a running Clojure web
>> > app
>> > with Ciders debugging feature, or something similar (with break points
>> > etc.)? So far I have only been able to use Ciders debugging feature on
>> > code
>> > running in my local REPL. Therefore, since I am developing a web app, I
>> > need
>> > to call my functions with mock requests.
>> >
>> > Best regards
>> > ahawk
>> >
>> > --
>> > You received this message because you are subscribed to the Google
>> > Groups "Clojure" group.
>> > To post to this group, send email to clo...@googlegroups.com
>> > Note that posts from new members are moderated - please be patient with
>> > your
>> > first post.
>> > To unsubscribe from this group, send email to
>> > clojure+u...@googlegroups.com
>> > For more options, visit this group at
>> > http://groups.google.com/group/clojure?hl=en
>> > ---
>> > You received this message because you are subscribed to the Google
>> > Groups
>> > "Clojure" group.
>> > To unsubscribe from this group and stop receiving emails from it, send
>> > an
>> > email to clojure+u...@googlegroups.com.
>> > For more options, visit https://groups.google.com/d/optout.
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with your
> first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to