Kyle, this is fantastic stuff - your “blook” is the best Clojure resource I’ve found after lots of seeking, and I’ve enjoyed exploring some of your other posts.
I poked around your site but maybe I missed it: is there any way to sign up for email updates (or some other notification) when you make a new post? If I must resort to it, I will check back periodically, but ideally I’d love to be notified as soon as you post something so I can devour it immediately!
Again, great stuff…can’t wait for what comes next!
anonymous, on
How come that couldn’t simply be expressed as (take 10 (iterate inc 0))?
Just demonstrating that lazy operations can be chained together. We’ll talk more about execution order and side effects in a later chapter. :)
Michael Waclawiczek, on
I’d like to point out to the readers of this post that NuoDB CTO Seth Proctor and two other key members of the NuoDB engineering team have posted several blog entries on the topic of network failure handling and testing. To find out more, follow this link:
As a beginner in Clojure (and LISP in general), I could say that this is the most inspiring tutorial I know of for now! Looking forward for the next article.
John Sanda, on
This is a great series. Content and delivery are both excellent! I have one question on the section about the infseq lazy sequence. How come that couldn’t simply be expressed as (take 10 (iterate inc 0))?
Bryan Lott, on
Thank you for posting this!!! This is the first tutorial I’ve done on Clojure that I feel has actually gotten me comfortable with the language. Can’t wait for the next installment :)
wuschel, on
Thank you for posting this.
I am looking into Lisp based languages these days, and as such I find it always good to get more basic information on language semantics.
There are a couple of things however that make a transition to Clojure very hard, and I think it would do some good if more information about these obstacles could be written down:
1) A lot of work needs to be invested to get a IDE going. I wasted a lot of time with emacs and Sublime Text 2/SublimeREPL before settling for Light Table. Note: I find the first two choices to be excellent editors, it is just that it is hard to get them going the way one wants to.
2) The JVM is said to be one of Clojures greatest assets. For me - I started programming with Python - reading java lingo error tracebacks and browsing the source code of JVM packages is very unpleasent experience.
An introduction on how to tackle the JVM library ‘problem’ in an efficient way a la Python would be great.
3) Compilation to JAR, running a service on GAE/Amazon without loosing much time on JVM startup and other practical things might be a nice to have in your guide.
4) Since multithreading is one of the key characteristics that sets Clojure apart from other lisp/scheme based languages e.g. the easy but great Chicken Scheme, it would be great to have a good look on parallel computing in the tutorial.
Cheers!
Adrian, on
Thankyou for this article. I often find myself wallpapering over my sexuality in professional environments to avoid any “awkward looks”. It is important for queer coders to be visible to their peers and their lives celebrated equally. It put a smile on my face to read something that speaks to me both socially and technically :)
A less courageous stranger, on
Thanks for writing about this Aphyr.
Mahesh Paolini-Subramanya, on
Listening is so very under-rated, and taking the time to do so - even more so.
Making the time to listen is maybe the hardest of all, because in our heart of hearts most of us believe that we don’t need to do so, because we know, or understand. That, in the end, is probably the greatest tragedy of all.
As Ta-Nehisi Coates put it today “God is not in the habit of talking–because we are not in the habit of listening.”
Aphyr, on
Thanks Greg, that is a typo. Fixed now. :)
Greg, on
Are you sure the implementation of inc-more is correct? I believe it should call itself recursively instead of inc-first.
Sergey, on
Hello, Kyle!
You are a man! Thanks a bunch for this guide, looking forward to next posts :)
Bridget, on
Thank you! This is a great resource. Please keep it going. Let us know how we can help support you.
Alex Moore, on
You’re missing a } on the end of your recipe.
Thanks for the tutorial
Donald Parish, on
Great intro. Keep them coming. Give me a tip jar or publish an ebook like Brian Marick, and I’ll buy it!
Nathan, on
Good stuff, looking forward to the next installment.
Robert, on
When we start retrying failed requests we can repeat a request which failed just before returning a response, so they need to be idempotent. That got me wondering: would backup requests help? I mean sending a request to a second dyno if it takes long enough. Upon receiving a response from either of them, we send the response back and try to cancel the other one (if it is still in the queue). This increases load, but decreases latency dispersion if the distribution of latencies of different dynos are independent.
Pierre, on
great series! thank you a lot, can’t wait for next ones
Deejay, on
Have you had a chance to re-run these tests on later versions of Cassandra (2.0.2) to see if the issues are genuinely fixed?
Jim’s arguments are essentially, “I believe that I have a good way of sacrificing consistency for availability in a way that really minimizes the impact on consistency.” Jim, in case you hadn’t been paying attention, that’s essentially what every NoSQL database engineer has been trying to do for at least the past 10 years. You have just picked the most obnoxious way of saying it.
Peter, on
Agreed with above users - this tutorial series is the best Clojure introduction I’ve seen!
Joshua, on
This is the most thoughtful and helpful introduction to Clojure I have yet encountered… I finally feel like I’m getting to grips with this fascinating language. Thank you!
Pontus, on
These posts are awesome! Keep up the good work :)
Aphyr, on
Thanks Phil. Was playing a little fast and loose there with qualified names, but I think you’re right, it does make sense to introduce the dual symbol resolution here instead. Vars come in Chapter 3.
Phil, on
Nice article; does a good job of surveying the lay of the land. One correction though:
Every symbol actually has two names: one, a short name, is used to refer to things locally. Another is the fully qualified name, which is used to refer unambiguously to a symbol from anywhere.
Actually some symbols are qualified and some aren’t. Unqualified symbols are typically resolved to vars which do have namespaces, but that connection comes from the ns-map of the namespace under which evaluation is performed and isn’t a property of the symbol.
Thanks for both the article and statement of purpose! This is a great reference for learning clojure– especially since I’m completely new to lisps.
Great series! One possible correction:
user=> #‘user/cats 5
#'user/cats evaluates to #'user/cats at my REPL.
Such a lovely place… Dreamland. Hope to visit New Zealand some day :)
What a place! I wish I have this picture in higher resolution to make wallpaper from it :)
Thanks rptabo. Glad to hear these posts are working out well for you. :)
The index pages and tag pages have ATOM feeds, linked with the standard headers, but I think browsers have started to drift away from displaying those. If you’ve got an ATOM client, try http://aphyr.com/tags/Clojure-from-the-ground-up.atom, or http://aphyr.com/posts.atom for all the posts.
Kyle, this is fantastic stuff - your “blook” is the best Clojure resource I’ve found after lots of seeking, and I’ve enjoyed exploring some of your other posts.
I poked around your site but maybe I missed it: is there any way to sign up for email updates (or some other notification) when you make a new post? If I must resort to it, I will check back periodically, but ideally I’d love to be notified as soon as you post something so I can devour it immediately!
Again, great stuff…can’t wait for what comes next!
Just demonstrating that lazy operations can be chained together. We’ll talk more about execution order and side effects in a later chapter. :)
I’d like to point out to the readers of this post that NuoDB CTO Seth Proctor and two other key members of the NuoDB engineering team have posted several blog entries on the topic of network failure handling and testing. To find out more, follow this link:
http://dev.nuodb.com/techblog/network-failure-handling-roundup
As a beginner in Clojure (and LISP in general), I could say that this is the most inspiring tutorial I know of for now! Looking forward for the next article.
This is a great series. Content and delivery are both excellent! I have one question on the section about the infseq lazy sequence. How come that couldn’t simply be expressed as (take 10 (iterate inc 0))?
Thank you for posting this!!! This is the first tutorial I’ve done on Clojure that I feel has actually gotten me comfortable with the language. Can’t wait for the next installment :)
Thank you for posting this.
I am looking into Lisp based languages these days, and as such I find it always good to get more basic information on language semantics.
There are a couple of things however that make a transition to Clojure very hard, and I think it would do some good if more information about these obstacles could be written down:
1) A lot of work needs to be invested to get a IDE going. I wasted a lot of time with emacs and Sublime Text 2/SublimeREPL before settling for Light Table. Note: I find the first two choices to be excellent editors, it is just that it is hard to get them going the way one wants to.
2) The JVM is said to be one of Clojures greatest assets. For me - I started programming with Python - reading java lingo error tracebacks and browsing the source code of JVM packages is very unpleasent experience.
An introduction on how to tackle the JVM library ‘problem’ in an efficient way a la Python would be great.
3) Compilation to JAR, running a service on GAE/Amazon without loosing much time on JVM startup and other practical things might be a nice to have in your guide.
4) Since multithreading is one of the key characteristics that sets Clojure apart from other lisp/scheme based languages e.g. the easy but great Chicken Scheme, it would be great to have a good look on parallel computing in the tutorial.
Cheers!
Thankyou for this article. I often find myself wallpapering over my sexuality in professional environments to avoid any “awkward looks”. It is important for queer coders to be visible to their peers and their lives celebrated equally. It put a smile on my face to read something that speaks to me both socially and technically :)
Thanks for writing about this Aphyr.
Listening is so very under-rated, and taking the time to do so - even more so. Making the time to listen is maybe the hardest of all, because in our heart of hearts most of us believe that we don’t need to do so, because we know, or understand. That, in the end, is probably the greatest tragedy of all.
As Ta-Nehisi Coates put it today “God is not in the habit of talking–because we are not in the habit of listening.”
Thanks Greg, that is a typo. Fixed now. :)
Are you sure the implementation of inc-more is correct? I believe it should call itself recursively instead of inc-first.
Hello, Kyle! You are a man! Thanks a bunch for this guide, looking forward to next posts :)
Thank you! This is a great resource. Please keep it going. Let us know how we can help support you.
You’re missing a
}on the end of your recipe.Thanks for the tutorial
Great intro. Keep them coming. Give me a tip jar or publish an ebook like Brian Marick, and I’ll buy it!
Good stuff, looking forward to the next installment.
When we start retrying failed requests we can repeat a request which failed just before returning a response, so they need to be idempotent. That got me wondering: would backup requests help? I mean sending a request to a second dyno if it takes long enough. Upon receiving a response from either of them, we send the response back and try to cancel the other one (if it is still in the queue). This increases load, but decreases latency dispersion if the distribution of latencies of different dynos are independent.
great series! thank you a lot, can’t wait for next ones
Have you had a chance to re-run these tests on later versions of Cassandra (2.0.2) to see if the issues are genuinely fixed?
Would love to see a jepsen test of Hazelcast!
The point of the CAP theorem–according to its author, Eric Brewer (I suppose a “third-rate academic” to Jim Starkey), was to point out that (a) for many use cases, availability is more important than consistency, (b) ACID databases sacrifice availability for consistency, and © there is a case to sacrifice immediate consistency for availability. And it took something like five years before there were enough other use cases in the wild (e.g., Amazon) to make these observations useful to serious practitioners.
Jim’s arguments are essentially, “I believe that I have a good way of sacrificing consistency for availability in a way that really minimizes the impact on consistency.” Jim, in case you hadn’t been paying attention, that’s essentially what every NoSQL database engineer has been trying to do for at least the past 10 years. You have just picked the most obnoxious way of saying it.
Agreed with above users - this tutorial series is the best Clojure introduction I’ve seen!
This is the most thoughtful and helpful introduction to Clojure I have yet encountered… I finally feel like I’m getting to grips with this fascinating language. Thank you!
These posts are awesome! Keep up the good work :)
Thanks Phil. Was playing a little fast and loose there with qualified names, but I think you’re right, it does make sense to introduce the dual symbol resolution here instead. Vars come in Chapter 3.
Nice article; does a good job of surveying the lay of the land. One correction though:
Actually some symbols are qualified and some aren’t. Unqualified symbols are typically resolved to vars which do have namespaces, but that connection comes from the ns-map of the namespace under which evaluation is performed and isn’t a property of the symbol.