Clojure 从EDN文件读取的调用函数
我有一个EDN配置文件,其中的条目引用现有功能,例如:Clojure 从EDN文件读取的调用函数,clojure,edn,Clojure,Edn,我有一个EDN配置文件,其中的条目引用现有功能,例如: :attribute-modules {:content {:class lohan.extractors.content/process} :schema {:class lohan.extractors.schema/process} :label {:class lohan.extractors.label/process}
: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,这些条目被读取为符号,但我希望能够在运行时调用它们。其目的是为用户提供一种提供其自己的功能集的方法
如何实现这一点?您可以使用调用由符号引用的变量中的函数 例如,如果要使用其符号调用
+
,可以使用:
((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的用户具有高度信任,以防止他们在运行环境中执行您不希望他们访问的任何功能 您可以使用调用由符号引用的变量中的函数 例如,如果要使用其符号调用
+
,可以使用:
((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的用户具有高度信任,以防止他们在运行环境中执行您不希望他们访问的任何功能