2015-01-13 51 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的用戶具有高度信任,以防止它們在運行環境中執行任何不希望它們訪問的功能。