2016-05-06 84 views
5

ClojureScript var argümanının statik, derleme zamanı meta verilerine dayanarak bir geri dönüş formunun oluşturulmasını bildiren bir ClojureScript makrosu (Clojure yoluyla yürütüldü/derlendi) oluşturmak istiyorum.Derleme zamanı cljs var meta verileri clj makrosuna nasıl erişilir?

ClojureScript kodundan derleme zamanı, statik değişken meta verilerine ((meta (var varsym)); bkz. this post) erişmek mümkün olduğunu anlıyorum. Fakat bu veri, derleme sürecine bir makrodan erişebilmemiz için erişilebilir mi? İşte

ben yapmak istiyorum kabaca kroki (ve soru get-meta-for-varsym aşağıda yazacağımı nasıl gerçekten): Bunun için

;; 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

JVM uygulamasının aksine, ClojureScript çalışma zamanında 'Var' kullanmaz, ancak bunun yerine çıplak Javascript değişkenlerini kullanır. –

+0

@Nathan Davis: Yup; Onu anlıyorum. Ancak ClojureScript hala statik var metadata izin veren bir cephe oluşturur. Hangi güzel ve birçok amaç için yeterince iyi. – metasoarous

cevap

6

Eğer Clojurescript analizörü kullanmak zorunda:

Sonra clojurescript dosyasında
(ns your-macros 
    (:require [cljs.analyzer :as cljs])) 

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

:

(ns your-cljs) 

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

(var-data xxy) 

meta veri olacak :meta haritanın anahtarı.

+0

Cevabınız için teşekkürler! Genel yaklaşımı seviyorum ama maalesef benim için çalışmıyor. "Var-data" işlevini "resol-var" olarak adlandırıyorum, ancak döndürdüğü harita bir ': meta' anahtarı içermiyor. – metasoarous

+0

Benim için çalışıyor. Hangi cljs sürümü? – ClojureMostly

+0

Cljs 1.8.51 kullanıyorum – metasoarous