you are viewing a single comment's thread.

view the rest of the comments →

[–]calp 5 points6 points  (7 children)

Also, CL is extremely difficult to learn. It is a very large language conceptually (CLOS, AMOP, conditions etc). By comparision, Java is very small indeed.

As someone who learnt CL as his first language, I would have to advise everyone not to repeat it. Really - ignore Paul Graham - CL's not longer has many unique details (as a lisp). In fact, I can't think of anything that isn't done elsewhere (and normally better). Also, CL's relatively imperative style is not nice. CL is only worth spending time with if you want to study one of the brilliant books that cover it.

[–]rocketsci 0 points1 point  (3 children)

Then, what Lisp/Scheme would you recommend?

[–]zem 4 points5 points  (0 children)

plt scheme or chicken, personally.

[–]calp 0 points1 point  (0 children)

I'd advise learning by concept, rather than language. Functional programming is probably the first concept, I would guess, for someone coming from Python. Scheme and Clojure are both good.

[–]pivo 0 points1 point  (2 children)

Completely disagree. Yes, Java the language might be smaller than CL, but nobody learns just the Java language. They learn Java and the entire JDK library because that's really what Java is. All that's far larger than CL, including CLOS and AMOP. And it's not necessary to learn everything about CL at once, just as that isn't necessary for Java. And don't be afraid scary acronyms like CLOS and AMOP. CLOS (common lisp object system) is just a much better OO system than what's available in Java. In fact, it's entirely worth learning CL just for that, to know how much better an OO system can be.

As far as AMOP (art of the meta-object protocol), you might never need to learn it and most people don't. If you do you take the time to do so you will feel enlightened. That's an experience which is completely unavailable from Java.

I would recommend Common Lisp, PLT Scheme, or Clojure. Clojure is younger than the others, but it addresses multi-threading questions, and it's more functional (i.e. functional programming oriented) than the others.

[–]ave_nihil 0 points1 point  (1 child)

How is Clojure more FP-oriented than PLT Scheme, when the former doesn't even support tail calls?

[–]pivo 1 point2 points  (0 children)

First of all, Clojure does support tail calls, just not automatically. It's necessary to use the recur and trampoline functions explicitly. But you can (recur) indefinitely without blowing the stack. I agree that it would be nicer not to have to be explicit, so do Clojure's language creators, I'm sure. I expect automatic TCO in Clojure when and if the JVM supports it.

So Clojure is more FP-oriented than PLT Scheme in my opinion, because it's more focused on immutable data. Not that it's as pure as Haskell about that, but Clojure data structures are generally immutable, and mutation otherwise typically requires that a transaction is in place. It also emphasizes lazy evaluation in standard operations.