<div dir="ltr">On Sun, Jul 26, 2015 at 1:36 PM, kirby urner <span dir="ltr"><<a href="mailto:kirby.urner@gmail.com" target="_blank">kirby.urner@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div>I'd say:  leverage your Python to tackle a second<br></div>OO language: Java (not JavaScript yet).  Then<br></div>leverage your Java, which need not be super<br></div>polished, to tackle Clojure.  That'll be a first <br></div>LISP-family language and will start to formalize<br></div>ground covered, making the concepts more <br></div>clear.  Pick up concurrency concepts here.<br><br></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></blockquote><div><br></div><div>I think there are a lot of good paths, and I see the logic of what you propose.  But as someone who uses both Clojure and Python, I'd like to remind you that Clojure introduces far more novelty than just the concurrency constructs.  The biggest difference is that all the fundamental data structures are immutable, which lends itself to a rather elegant programming style that in most languages is only available for numbers and maybe strings.  Once you embrace this, it really changes the way you code, and going back to a programming language that doesn't support immutable data well can feel painful.<br></div><div><br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div></div>Finally:  back to Python i.e. take what you've <br></div>learned on this circle tour to move into concurrency<br></div>with Python if you wish, and with new fondness <br></div>for a LISPish mindset.  </div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></blockquote><div><br></div><div>Yeah, as I point out above, in my experience most students don't want to go back to Python once they've embraced Clojure's way of doing things, because they can't employ those techniques well in Python.  Also, Clojure is fairly opinionated about being anti-OO (at least, in the sense of the way people usually think about OO).  So once you've drunk that Koolade, OO starts to feel kind of clunky and limiting as a way to organize programs.  But that's probably a good thing. Even among mainstream programmers, OO is "on the way out", getting replaced by things like component entity systems, inheritance-less interfaces, traits, multimethods, etc.<br></div><div><br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br><div dir="ltr"><div><div><div><div><div><div><div><div><div><div><div><div><div><div><br></div>Python first<br></div>Bridge to Java<br></div>Tackle concurrency in Clojure (runs on JVM)<br></div>back to Python, add more layers and polish<br></div></div></div></div></div></div></div></div></div></div></div></blockquote><div><br></div><div>Right.  My path for students looks more like:<br></div><div>Racket first<br></div><div>Bridge to Python and/or Java as a way to understand mainstream languages and paradigms and gain the ability to interact with the vast majority of code out there.  With these three languages under their belt, they can probably read and write code in most languages reasonably well.<br></div><div>Clojure as a language that fuses this all together: functional goodness similar to, and in some respects better than Racket, interoperation with Java and Javascript ecosystems.<br><br></div><div>Other languages worth "dipping one's toe into" could be:<br></div><div>C++ for low-level programming<br></div><div>Javascript for mainstream client-side web programming<br></div><div>Haskell for pure functional<br></div><div>Scala for a functional/OO hybrid with an intricate type system and a robust dataflow<br></div><div>ML to understand the style of pattern matching over abstract data types<br></div><div><br> <br></div></div></div></div>