1

エントリが既存の機能を参照する EDN 構成ファイルがあります。

:attribute-modules {:content {:class lohan.extractors.content/process}
                    :schema  {:class lohan.extractors.schema/process}
                    :label   {:class lohan.extractors.label/process}
                    :user    {:class lohan.extractors.user/process}
                    :env     {:class lohan.extractors.env/process}}

clojure.edn/read-edn を使用すると、これらのエントリはシンボルとして読み取られますが、実行時に呼び出すことができるようにしたいと考えています。これの目的は、ユーザーが独自の関数セットを提供する方法を提供することです。

どうすればこれを達成できますか?

4

1 に答える 1

7

を使用して、Symbol によって参照される var に保持されている関数を呼び出すことができますresolve

たとえば+、シンボルを使用して呼び出したい場合は、次を使用できます。

((resolve '+) 1 2)
;=> 3

したがって、あなたの例を使用すると、次のことができます。

((resolve (get-in  (clojure.edn/read-string "{:content {:class ohan.extractors.content/process}
                                              :schema  {:class lohan.extractors.schema/process}
                                              :label   {:class lohan.extractors.label/process}
                                              :user    {:class lohan.extractors.user/process}
                                              :env     {:class lohan.extractors.env/process}}")
                   [:content :class])))

ユーザーがアクセスできる許可されたシンボルのセットを制限するか、edn を提供しているユーザーに高いレベルの信頼を持たせて、実行環境で実行したくない機能をユーザーが実行できないようにする必要があります。へのアクセス。

于 2015-01-13T11:28:31.540 に答える