2015-01-13 50 views
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 /读EDN这些条目读符号,但我希望能够在运行时调用它们。这样做的目的是为用户提供一套自己的功能。

我怎样才能做到这一点?

回答

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