It is even simpler if you just run the following code: (println "plain-quote: " 'map) (println "syntax-quote: " `map)
with result: plain-quote: map syntax-quote: clojure.core/map The syntax-quote also allows you to unquote forms using `~` and `~@` (you can't do this with plain-quote). The combination allows you to easily make code templates, the same way you might make HTML templates with Selmer, Django, etc. For full details of macro writing, please see this answer: https://stackoverflow.com/questions/60212576/how-do-i-write-a-clojure-threading-macro Alan P.S. Note that you can use syntax quote in regular functions as a trick to easily fully-qualify symbol names. It is not *only* for macros. On Mon, Mar 2, 2020 at 4:49 AM Rutvik Patel <heyrut...@gmail.com> wrote: > > How can I make a symbol without a namespace in syntax quoting? > You need quote + unquote. > > user=> (defmacro moo2 [] `(defn ~'foo [])) > #'user/moo2 > user=> (macroexpand-1 '(moo2)) > (clojure.core/defn foo []) > user=> (moo2) > #'user/foo > > Focus on *~'foo *thing, we first *quote* the foo and *unquote* is using ~. > > On Mon, Mar 2, 2020 at 4:09 PM Anatoly Smolyaninov <zarkonesm...@gmail.com> > wrote: > >> Yes, backtick is hygienic, i.e. it adds ns to symbols. you can define >> name first and inject: >> >> ``` >> (defmacro moo2 [] >> (let [name (symbol "foo")] >> `(defn ~name []))) >> >> ``` >> >> понедельник, 2 марта 2020 г., 10:54:51 UTC+1 пользователь Sonny To >> написал: >>> >>> (defmacro moo1 [] >>> '(defn foo [])) >>> >>> (defmacro moo2 [] >>> >>> >>> `(defn foo [])) >>> >>> stigmergy.wocket.server> (moo1) >>> >>> #'stigmergy.wocket.server/foo >>> >>> >>> stigmergy.wocket.server> (moo2) >>> >>> CompilerException clojure.lang.ExceptionInfo: Call to clojure.core/defn >>> did not conform to spec: >>> In: [0] val: stigmergy.wocket.server/foo fails spec: >>> :clojure.core.specs.alpha/defn-args at: [:args :name] predicat\ >>> e: simple-symbol? >>> >>> #:clojure.spec.alpha{:problems [{:path [:args :name], :pred >>> clojure.core/simple-symbol?, :val stigmergy.wocket.ser\ >>> ver/foo, :via [:clojure.core.specs.alpha/defn-args >>> :clojure.core.specs.alpha/defn-args], :in [0]}], :spec #object[c\ >>> lojure.spec.alpha$regex_spec_impl$reify__2436 0x33d84248 >>> "clojure.spec.alpha$regex_spec_impl$reify__2436@33d84248"]\ >>> , :value (stigmergy.wocket.server/foo []), :args >>> (stigmergy.wocket.server/foo [])}, compiling:(*cider-repl workspac\ >>> e/clj-collage:localhost:39319(clj)*:131:26) >>> >>> stigmergy.wocket.server> (macroexpand-1 '(moo1)) >>> (defn foo []) >>> >>> stigmergy.wocket.server> (macroexpand-1 '(moo2)) >>> (clojure.core/defn stigmergy.wocket.server/foo []) >>> >>> >>> >>> >>> moo1 uses normal quoting while moo2 uses syntax quoting. Why does (moo1) >>> succeeds but( moo2) fails? Both seem to evaluate to same data-structure >>> except moo2 has namespaces. >>> >>> The error message is cryptic but it seems moo2 is failing on >>> clojure.core/simple-symbol? >>> which seems like a symbol without a namespace. How can I make a symbol >>> without a namespace in syntax quoting? >>> >>> >>> >>> >>> -- >> 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. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/clojure/82bdc4fc-2453-4561-80da-e3c6d6346900%40googlegroups.com >> <https://groups.google.com/d/msgid/clojure/82bdc4fc-2453-4561-80da-e3c6d6346900%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- > 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. > To view this discussion on the web visit > https://groups.google.com/d/msgid/clojure/CAABz%3DKr4qagDt1URgb9ZPHxvfCG4UfjiRE8Ch7Moaf%2BiX0UPaw%40mail.gmail.com > <https://groups.google.com/d/msgid/clojure/CAABz%3DKr4qagDt1URgb9ZPHxvfCG4UfjiRE8Ch7Moaf%2BiX0UPaw%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > -- 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. To view this discussion on the web visit https://groups.google.com/d/msgid/clojure/CAN67zA3o7G7cyTwTTS65E%3DjctKVPv%3D3bVQNOu%3Dnsw5bMugYxYQ%40mail.gmail.com.