2016-05-06 6 views
5

私は、ClojureScriptのvar引数の静的コンパイル時のメタデータに基づいたリターンフォームの構築を知らせるClojureScriptマクロ(Clojureを介して実行/コンパイル)を構築したいと考えています。cljマクロからcljs varメタデータをコンパイルするにはどうすればいいですか?

ClojureScriptコードからコンパイル時の静的なvarメタデータにアクセスできることを理解しています((meta (var varsym)); this postを参照)。しかし、このデータは、マクロからアクセスできるような方法でコンパイルプロセスにアクセスできますか?

ここで私がやりたいもののラフスケッチだ(との質問は、あなたが以下のget-meta-for-varsymを書くと思いますどのように実際にある):このため

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

ClojureScriptはJVMの実装とは異なり、実行時には 'Var'を使用しませんが、むしろ裸のJavascript変数を使用します。 –

+0

@Nathan Davis:はい。という事は承知しています。しかし、ClojureScriptは静的なvarメタデータを可能にするファサードを作成します。何がクールで、多くの目的のために十分です。 – metasoarous

答えて

6

あなたはClojurescriptアナライザを使用する必要があります。

次に、あなたのclojurescriptファイルに
(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地図のキー。

+0

答えをありがとう!私は全体的なアプローチが好きですが、残念ながらそれは私のためには機能しません。私は 'var-data'を' resolve-var'を呼び出すことができますが、返すマップには ':meta'キーは含まれていません。 – metasoarous

+0

私のために働く。どのようなcljsのバージョンですか? – ClojureMostly

+0

私はcljsを使用しています1.8.51 – metasoarous

関連する問題