I have read the "casting SPELs" tutorial, its russian version adapted for 
clojure athttp://lisperati.planvita.com/... And up to this time I can't 
understand how the following macro works: (see
http://lisperati.planvita.com/actions.html for russian version or 
http://lisperati.com/actions.html for original one for Lisp):


  `(defspel ~command [subject# object#]
     `(spel-print (cond (and (= location '~'~place)
                             (= '~subject# '~'~subj)
                             (= '~object# '~'~obj)
                             (have? '~'~subj))
                        ~@'~args
                        :else '(i cannot ~'~command like that -)))))


It is is used further like:

(game-action weld chain bucket attic
   (cond (and (have? 'bucket) (def chain-welded true))
              '(the chain is now securely welded to the bucket -)
         :else '(you do not have a bucket -)))


(game-action dunk bucket well garden
             (cond chain-welded 
                   (do (def bucket-filled true)
                       '(the bucket is now full of water))
                   :else '(the water level is too low to reach -)))


Here defspel - is just an alias for defmacro.
The reason to create the macro was to substitue the following functions:

(defn weld [subject object]
  (cond (and (= location 'attic)
             (= subject 'chain)
             (= object 'bucket)
             (have? 'chain)
             (have? 'bucket)
             (not chain-welded))
        (do (def chain-welded true)
            '(the chain is now securely welded to the bucket -))
        :else '(you cannot weld like that -)))

(defn dunk [subject object]
  (cond (and (= location 'garden)
             (= subject 'bucket)
             (= object 'well)
             (have? 'bucket)
             chain-welded)
        (do (def bucket-filled true)
            '(the bucket is now full of water))
        :else '(you cannot dunk like that -)))


 am completely confused with how this "game-action" macro works... *Can 
anybody explain me all things (nested quotes) about it?*

I have already read the following article - 
http://blog.8thlight.com/colin-jones/2012/05/22/quoting-without-confusion.html 
- 
it did not help...

macroexpand-1 scares me too...
This is its output for the weld game-action:

(clojure-magic-game.core/defspel weld [subject__1058__auto__ 
object__1059__auto__] (clojure.core/seq (clojure.core/concat 
(clojure.core/list (quote clojure-magic-game.core/spel-print)) 
(clojure.core/list (clojure.core/seq (clojure.core/concat 
(clojure.core/list (quote clojure.core/cond)) (clojure.core/list 
(clojure.core/seq (clojure.core/concat (clojure.core/list (quote 
clojure.core/and)) (clojure.core/list (clojure.core/seq 
(clojure.core/concat (clojure.core/list (quote clojure.core/=)) 
(clojure.core/list (quote clojure-magic-game.core/location)) 
(clojure.core/list (clojure.core/seq (clojure.core/concat 
(clojure.core/list (quote quote)) (clojure.core/list (quote attic)))))))) 
(clojure.core/list (clojure.core/seq (clojure.core/concat 
(clojure.core/list (quote clojure.core/=)) (clojure.core/list 
(clojure.core/seq (clojure.core/concat (clojure.core/list (quote quote)) 
(clojure.core/list subject__1058__auto__)))) (clojure.core/list 
(clojure.core/seq (clojure.core/concat (clojure.core/list (quote quote)) 
(clojure.core/list (quote chain)))))))) (clojure.core/list 
(clojure.core/seq (clojure.core/concat (clojure.core/list (quote 
clojure.core/=)) (clojure.core/list (clojure.core/seq (clojure.core/concat 
(clojure.core/list (quote quote)) (clojure.core/list 
object__1059__auto__)))) (clojure.core/list (clojure.core/seq 
(clojure.core/concat (clojure.core/list (quote quote)) (clojure.core/list 
(quote bucket)))))))) (clojure.core/list (clojure.core/seq 
(clojure.core/concat (clojure.core/list (quote 
clojure-magic-game.core/have?)) (clojure.core/list (clojure.core/seq 
(clojure.core/concat (clojure.core/list (quote quote)) (clojure.core/list 
(quote chain))))))))))) (quote ((cond (and (have? (quote bucket)) (def 
chain-welded true)) (quote (the chain is now securely welded to the bucket 
-)) :else (quote (you do not have a bucket -))))) (clojure.core/list :else) 
(clojure.core/list (clojure.core/seq (clojure.core/concat 
(clojure.core/list (quote quote)) (clojure.core/list (clojure.core/seq 
(clojure.core/concat (clojure.core/list (quote clojure-magic-game.core/i)) 
(clojure.core/list (quote clojure-magic-game.core/cannot)) 
(clojure.core/list (quote weld)) (clojure.core/list (quote 
clojure-magic-game.core/like)) (clojure.core/list (quote 
clojure-magic-game.core/that)) (clojure.core/list (quote 
clojure.core/-))))))))))))))
Even if to remove all namespaces and indent the output It will still look 
too complicated to understand for me:

(defspel weld [subject__1058__auto__ object__1059__auto__] 
  (seq (concat 
         (list (quote spel-print)) 
         (list (seq (concat 
                      (list (quote cond)) 
                      (list (seq (concat 
                                   (list (quote and)) 
                                   (list (seq (concat 
                                                (list (quote =)) 
                                                (list (quote location)) 
                                                (list (seq (concat 
                                                             (list (quote 
quote)) 
                                                             (list (quote 
attic)))))))) 
                                   (list (seq (concat (list (quote =)) 
                                                      (list (seq (concat 
                                                                   (list 
(quote quote)) 
                                                                   (list 
subject__1058__auto__)))) 
                                                      (list (seq (concat 
                                                                   (list 
(quote quote)) 
                                                                   (list 
(quote chain)))))))) 
                                   (list (seq (concat 
                                                (list (quote =)) 
                                                (list (seq (concat 
                                                             (list (quote 
quote)) 
                                                             (list 
object__1059__auto__)))) 
                                                (list (seq (concat 
                                                             (list (quote 
quote)) 
                                                             (list (quote 
bucket)))))))) 
                                   (list (seq (concat 
                                                (list (quote have?)) 
                                                (list (seq (concat 
                                                             (list (quote 
quote)) 
                                                             (list (quote 
chain))))))))))) 
                      (quote ((cond 
                                (and 
                                      (have? (quote bucket)) 
                                      (def chain-welded true)) 
                                (quote (the chain is now securely welded to 
the bucket -)) 
                                :else (quote (you do not have a bucket 
-))))) 
                      (list :else) 
                      (list (seq (concat 
                                   (list (quote quote)) 
                                   (list (seq (concat 
                                                (list (quote i)) 
                                                (list (quote cannot)) 
                                                (list (quote weld)) 
                                                (list (quote like)) 
                                                (list (quote that)) 
                                                (list (quote -))))))))))))))

I have also asked this question 
here... 
http://stackoverflow.com/questions/14910971/understanding-nested-quotes-for-game-action-clojure-macro-from-http-lisperati
No answers so far...

I would appreciate any help...

-- 
-- 
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/groups/opt_out.


Reply via email to