|
162 | 162 | fn*
|
163 | 163 | (let [[fname & bodies] (parsed-fn expanded)
|
164 | 164 | &env (if fname (add-env &env fname) &env)]
|
165 |
| - (concat '[fn*] |
| 165 | + (with-meta |
| 166 | + (concat '[fn*] |
166 | 167 | (when fname [fname])
|
167 | 168 | (for [[args & bodies] bodies
|
168 | 169 | :let [&env (reduce add-env &env args)]]
|
169 |
| - (list* args (map (partial iter &env) bodies))))) |
| 170 | + (list* args (map (partial iter &env) bodies)))) |
| 171 | + (meta exp))) |
170 | 172 |
|
171 | 173 | ;; else
|
172 | 174 | (map (partial iter &env) expanded))
|
|
316 | 318 | ;; else
|
317 | 319 | (let [butlast-body (doall (butlast bodies))
|
318 | 320 | last-body (last bodies)]
|
319 |
| - (gen-eval-node |
320 |
| - (do (doseq [x butlast-body] (evalme x &b)) |
321 |
| - (evalme last-body &b)))))))) |
| 321 | + (gen-eval-node (do (doseq [x butlast-body] (evalme x &b)) |
| 322 | + (evalme last-body &b)))))))) |
322 | 323 |
|
323 | 324 | (defmethod seq->eval-node 'letfn* seq-eval-letfn [iden->idx recur-indices [_ bindings & bodies :as form]]
|
324 | 325 | (let [promises (for [[k f] (partition 2 bindings)
|
|
398 | 399 | (::fn-sym-introduced (meta def)))
|
399 | 400 | (range))
|
400 | 401 | recur-indices (mapv iden->idx (::symbol-loop (meta def)))]]
|
401 |
| - [arity (->eval-node iden->idx recur-indices (list* 'do bodies))]))] |
402 |
| - (make-fn-body fname symbol-used arity->body-node arity->symbols-introduced iden->idx vararg-arity))) |
| 402 | + [arity (->eval-node iden->idx recur-indices (list* 'do bodies))])) |
| 403 | + meta-node (->eval-node iden->idx nil (::meta-exp (meta form)))] |
| 404 | + (cond-> (make-fn-body fname symbol-used arity->body-node arity->symbols-introduced iden->idx vararg-arity) |
| 405 | + meta-node (-> (evalme &b) (with-meta (evalme meta-node &b)) (gen-eval-node))))) |
403 | 406 |
|
404 | 407 | (def ^:const max-let-bindings 32)
|
405 | 408 |
|
|
707 | 710 | ::fn-sym-introduced (-> symbol-loop ;; arguments + let vars
|
708 | 711 | (into (set (mapcat (comp ::symbol-introduced meta) bodies))))
|
709 | 712 | ::symbol-loop symbol-loop
|
710 |
| - #_(set (keys new-acc-1))}))] |
| 713 | + #_(set (keys new-acc-1))})) |
| 714 | + meta-map (-> (meta fn-expression) (dissoc :line :column :file) (not-empty)) |
| 715 | + meta-exp (enhance-code sym->iden meta-map)] |
711 | 716 | (with-meta (if fname (list* 'fn* fname fbodies) (list* 'fn* fbodies))
|
712 | 717 | ;; symbol-introduced is nil because it is a new closure!
|
713 |
| - {::symbol-used (set (mapcat (comp ::symbol-used meta) fbodies))}))) |
| 718 | + {::meta-exp meta-exp |
| 719 | + ::symbol-used (set (mapcat (comp ::symbol-used meta) fbodies))}))) |
714 | 720 |
|
715 | 721 | (defmethod enhance-code 'try [sym->iden [_ & xs]]
|
716 | 722 | (let [bodies (remove (fn [x] (and (seq? x) ('#{finally catch} (first x)))) xs)
|
|
0 commit comments