Hi Laurent, Thanks for your detailed explanation! It greatly helped me understand the usage of quoting.
Stefan On Sep 10, 5:27 pm, Laurent PETIT <laurent.pe...@gmail.com> wrote: > 2010/9/10 Stefan Rohlfing <stefan.rohlf...@gmail.com>: > > > > > > > > > > > @ Nicolas and ajuc > > > Thank you very much for showing me where I went wrong! With so many > > parentheses it sometimes happens that I misplace one > > > Now the output of the function is as expected: > > > (defn prefix->postfix [expr] > > (if (coll? expr) > > (let [ [op arg1 arg2] expr] > > [ (prefix->postfix arg1) (prefix->postfix arg2) op]) ;; <-- > > removed on parenthesis here > > expr)) > > > (prefix->postfix '(+ 2 (* 3 2))) > > ;; --> [2 [3 2 *] +] > > > There is just one point I still don't quite understand. That is, > > during one of the recursive calls, the expression (* 3 2) is passed as > > an argument to prefix->postfix: > > > (prefix->postfix (* 3 2)) > > > As prefix->postfix is a normal function and not a macro, (* 3 2) > > should get evaluated BEFORE being passed to the function. However, > > this is not the case here. > > > Could it be that because (* 3 2) is quoted, because the initial > > argument to the function, '(+ 2 (* 3 2)), was quoted? > > > Could it be that because the initial argument to prefix->postfix, '(+ > > 2 (* 3 2)), is quoted, (* 3 2) is also quoted and therefore does not > > get evaluated? > > Yes. '(+ 2 (* 3 2)) being quoted means that the function receives a > datastructure : a list composed of the symbol +, the number 2, and > finally a list composed of the symbol *, the number 3 and the number > 2. > ' is a syntactic sugar for the special form named quote , whose > purpose is to not evaluate everything which is quoted, and just keep > as a datastructure what the reader has read. > > And now, food for thought :-) : > > user=> (quote (defn x)) > (defn x) > > ;; => See, no macroexpansion, just what the reader read > > user=> (read-string "(defn x)") > (defn x) > > ;; => I prove the point of above: just what the reader read > > user=> (quote (defn ^{:foo :bar} x)) > (defn x) > > ;; => but in the above ^^^, where's :foo :bar ? > > user=> (meta (second (quote (defn ^{:foo :bar} x)))) > {:foo :bar} > > ;; => it's there, but the reader has already interpreted the ^ > (because it is a reader macro) and placed {:foo :bar} as the metadata > map for the symbol x > > HTH, > > -- > Laurent -- 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