我有一个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将这些条目读取为符号,但我希望能够在运行时调用它们。这样做的目的是为用户提供自己的一组功能。
我怎样才能做到这一点?
发布于 2015-01-13 11:28:31
可以使用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的用户具有高度信任,以防止他们在运行环境中执行您不希望他们访问的任何函数。
https://stackoverflow.com/questions/27920520
复制相似问题