2008/12/22 J. McConnell <jdo...@gmail.com> > On Mon, Dec 22, 2008 at 10:23 AM, Piotr 'Qertoip' Włodarek > <qert...@gmail.com> wrote: > > > > Being new to Clojure, to Lisp and to functional programming in > > general, I have some trouble wraping my head around it. > > > > As the first exercice, I would like to print multiplication table of > > specified order, like: > > (print-multiplication-table 3) > > 1 2 3 > > 2 4 6 > > 3 6 9 > > > > I came that far: > > > > (defn multiplication-row [n k] > > (map (partial * k) (range 1 (inc n)))) > > > > (defn multiplication-table [n] > > (map (partial multiplication-row n) (range 1 (inc n)))) > > > > (println (multiplication-table 3)) ; => ((1 2 3) (2 4 6) (3 6 9)) > > > > Now, how to pretty print this? > > > > This does not work - prints nothing - why?: > > (defn pretty-print-row [row] > > (map print row)) > > The problem is that you are using map in two different ways here. In > the multiplication-row and multiplication-table functions you are > using it correctly as a function that applies a given function to all > of the values in a collection, returning the results in a new > collection. In the pretty-printing function you do not care about the > results like you did in the above two functions, you care about the > side-effects. For this, you can use doseq: > > 1:1 user=> (defn multiplication-row [n k] > (map (partial * k) (range 1 (inc n)))) > #'user/multiplication-row > 1:3 user=> (defn multiplication-table [n] > (map (partial multiplication-row n) (range 1 (inc n)))) > #'user/multiplication-table > 1:5 user=> (defn pretty-print-row [row] > (doseq [v row] (print v \space)) (print \newline)) > #'user/pretty-print-row > 1:7 user=> (defn print-multiplication-table [n] > (doseq [row (multiplication-table n)] (pretty-print-row row))) > #'user/print-multiplication-table > 1:9 user=> (print-multiplication-table 3) > 1 2 3 > 2 4 6 > 3 6 9 > nil > 1:10 user=> (print-multiplication-table 5) > 1 2 3 4 5 > 2 4 6 8 10 > 3 6 9 12 15 > 4 8 12 16 20 > 5 10 15 20 25 > nil > > HTH, > > - J. >
This is off topic from the original questions, but are the 1:#'s in your REPL line numbers? If so, what did you do to get those? Also if those are line numbers how come only odd numbers are printed? What does the '1:' stand for? Thanks. > > > > --~--~---------~--~----~------------~-------~--~----~ 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 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 -~----------~----~----~----~------~----~------~--~---