2016-05-06 29 views
5

Mi piacerebbe costruire una macro ClojureScript (eseguita/compilata tramite Clojure) che informa della sua costruzione di un modulo di ritorno basato sui metadati statici in fase di compilazione di un argomento var ClojureScript.Come accedere ai metadati di cljs var di compilazione time da una macro clj?

Capisco che è possibile accedere ai metadati di variabili statiche in fase di compilazione dal codice ClojureScript (utilizzando (meta (var varsym)); vedere this post). Ma questi dati sono accessibili al processo di compilazione in modo tale da poterci accedere da una macro?

Ecco un abbozzo di quello che mi piacerebbe fare (e la questione è davvero come si sarebbe scrivere get-meta-for-varsym sottostante):

;; executed/compiled in clj, targeting cljs 
(defmacro themacro 
    [varsym & args] 
    (let [var-meta (get-meta-for-varsym varsym) 
     return-form (compile-return-form-from-metadata var-meta args)] 
    return-form)) 
+0

A differenza dell'implementazione JVM, ClojureScript non utilizza 'Var's in fase di runtime, ma utilizza invece variabili JavaScript nude. –

+0

@Nathan Davis: Yup; Lo capisco. Ma ClojureScript crea ancora una facciata che consente i metadati di variabili statiche. Che è bello, e abbastanza buono per molti scopi. – metasoarous

risposta

6

Per questo è necessario utilizzare l'analizzatore ClojureScript:

(ns your-macros 
    (:require [cljs.analyzer :as cljs])) 

(defmacro var-data 
    [sym] 
    (cljs/resolve-var &env sym)) 

Poi nel file ClojureScript:

(ns your-cljs) 

(def ^{:foo :bar} xxy {}) 

(var-data xxy) 

I metadati saranno in :meta chiave della mappa.

+0

Grazie per la risposta! Mi piace l'approccio generale, ma sfortunatamente non funziona per me. Posso ottenere 'var-data' per chiamare' resolve-var', ma la mappa che restituisce non include una chiave ': meta'. – metasoarous

+0

Funziona per me. Quale versione di cljs? – ClojureMostly

+0

Sto usando cljs 1.8.51 – metasoarous

Problemi correlati