从EDN文件读取的调用函数

时间:2015-01-13 10:56:55

标签: clojure edn

我有一个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这些条目被读作符号,但我希望能够在运行时调用它们。这样做的目的是为用户提供一种提供自己的一组功能的方法。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:7)

您可以使用resolve调用符号引用的var中保存的函数。

例如,如果您想通过使用其符号来调用+,您可以使用:

((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的用户具有高度信任,以防止他们在您不希望的运行环境中执行任何功能他们可以访问。