hi guys, as i’m trying to understand how macro works through thread first -> source. could you pls explain what this line does
(with-meta '(~(first form) ~x ~@(next form)) (meta form))
im also curious about the use of with-meta and meta in this macro definition
First, quote and syntax-quote
I think you’ll want syntax-quote and not quote:
' (quote)
` (syntax-quote)
The syntax quote “lets you put things inside it” with ~ (“insert one element”) and ~@ (“insert many elements”)
Second, metadata.
;; When you define Clojure var, metadata is attached.
(def g
"gravitational accelleration in m/s2"
9.81)
;; If we just evaluate g and ask for meta, we get nothing, since we evaluated.
(meta g)
;; => nil
;; If we ask for the "reference to g", we'll get the metadata
(meta #'g)
;; => {:line 7,
;; :column 1,
;; :file
;; "/home/teodorlu/sandbox/clojure/scratch/src/th/scratch/rnd_2020_04_30.clj",
;; :doc "gravitational accelleration in m/s2",
;; :name g,
;; :ns #namespace[th.scratch.rnd-2020-04-30]}
You can attach your own metadata using with-meta
(let [eggs (with-meta {:eggs/count 3} {:doc "Please don't break them!"})]
eggs)
;; => #:eggs{:count 3}
(let [eggs (with-meta {:eggs/count 3} {:doc "Please don't break them!"})]
(meta eggs))
;; => {:doc "Please don't break them!"}
Does that clear up any confusion?
tks u for your explanation, after doing further research from here, i came to understand that this also preserve form metadata. by saying preserve, could you pls tell me more about metadata use cases?
Metadata is attached to objects supporting it, but in Clojure, since you don’t mutate arguments, you often return a modified new object from an existing one. The new modified object will have the metadata from the original one only if the macro or function you used to modify it preserves metadata. That means that it copies over the metadata from the original object to the returned one.
tks u all for your help. i could understand it now 

You’ve been asking good questions 