(Caveat: I have never seen *any* Clojure presentations, even on Youtube.) (1) Others may disagree, but ... although I love Lisps, think that purely functional programming is cool, and have come to see that there are situations in which FP is *great*, I am not someone who thinks that FP is always clearer (easier to understand) or as clear as imperative programming. For some jobs, one can be be made clearer than the other. Maybe, in addition to providing examples in which FP is clearer, you would want to provide an example in which it's less clear. Since so many people go around promoting the latest, greatest thing that will solve all of your programming problems, it might build trust to show that you understand that there are tradeoffs.
(2) The REPL. Show how easy it is to stop your program and inspect data structures, or to try out a new function with different arguments, or to chain some functions together in an experimental way. (3) pmap. I had a program that was mapping a function over a sequence of data structures to produce the next sequence of data structures. Then I added "p" to two instances of "map", and got a 2-4X speedup. It would have been more if I'd had more cores. Then I rearranged the code a little bit so that I only needed one map or pmap call, and got a little more speed. Occasionally, during debugging, I replace pmap with map so that I can see the sequence. Easy peasy. Multiprocessing in Clojure isn't always that easy, but I'd guess that it's it's never that easy in other popular languages. (4) Discussions of the advantages of FP often neglect to mention that it can foster modularity. I wrote a program in Common Lisp that had a main loop which repeatedly updated the state of data structures. I need various sorts of output from each iteration of the loop, but I didn't need any one kind of output all of the time. So I embedded calls to output functions wrapped in 'if' statements at various places in the loop. Messy. When I rewrote the program in Clojure, I made the loop into a lazy sequence using 'iterate'. When I want output, I "embed" it in the sequence by mapping one or another function over the sequence produced by 'iterate'. The "main loop", i.e. the function that 'iterate' calls, is free of any output functions, so it's simpler, and I can add or combine output functions as needed by mapping them over the lazy sequence--or not, as needed. (Of course I have to be careful since I'm mixing laziness and side effects, but in this particular case it's easy to avoid problems.) (5) Which reminds me: Going back to point (1) about building trust, maybe it's worth mentioning that you will need side effects some time, and Clojure is going to make you mix it with laziness simply because so many of the useful functions generate lazy sequences. This can be a pain, and *will* generate annoying bugs, at least at first. But as with any programming style, you have to develop good practices in order to avoid gotchas. -- 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.