在我的应用程序中,我为用户提供了一些界面,他们可以提供代码和应用程序评估沙箱内的代码(因此不允许使用eval
)。事情是我需要捕捉如果用户覆盖一些内置函数,如?=
如何在Clojure中引用“= already”:#'clojure.core/=在namespace:user中被替换为#'user/=“?
任何想法如何捕捉并防止东西(的想法是他们不应该是能够做到这一点)
代码:
(defn =
[]
//some code)
WARNING: = already refers to: #'clojure.core/= in namespace: user, being replaced by: #'user/=
一种解决方案可能是:
我试图得到的警告信息为String
,但with-out-str
功能不起作用。
(with-out-str
(defn = []))
;=> ""
还写道,with-err-str
(改变带出-STR点点)没有正常工作。
(defmacro with-err-str
[& body]
`(let [s# (new java.io.StringWriter)]
(binding [*err* s#]
[email protected]
(str s#))))
(with-err-str
(defn = []))
;=> ""
极品:"WARNING: = already refers to: #'clojure.core/= in namespace: user, being replaced by: #'user/="
好一个!但我需要没有eval tho :) –
>他们可以提供代码和应用程序评估代码 那么你怎么做呢? (编辑问题PLZ) – skrat
是啊,你是对的,但有一些内部的东西,我没有说我需要说我猜,因为它在沙箱中运行eval fn是不允许的:/但我真的很喜欢你的答案会尝试使它适用于我的使用案例 –