2017-03-13 22 views
1

我的问题需要将自定义逻辑函数应用于结构。这些函数以字符串形式存储在数据库中。我的数据是这样的:以公共结构作为参数的ClojureScript中的eval-str

(def fruits {:apple {:color "red" :ripe? true} 
      :strawberry {:color "red" :ripe? false}}) 

而且我有这个COND检查:

"(some (fn [fruit] (-> fruit val :ripe? false?)) fruits)" 

可惜的是,我不能得到这个权利,即使我尝试过各种方法:

1)

(cljs/eval-str (cljs/empty-state) 
      "(some (fn [fruit] (-> fruit val :ripe? false?)) my.main/fruits)" 
      "" 
      {:eval cljs/js-eval} 
      identity) 

此作品尚未出现错误:

WARNING: No such namespace: my.main, could not locate my/main.cljs, my/main.cljc, or Closure namespace "" at line 1 
WARNING: Use of undeclared Var my.main/fruits at line 1 

此外,这种方法显然不适用于高级编译。

2)我试图利用的办法,用Clojure工作:

((eval 
    (read-string 
    "(fn [fruits] 
     (some (fn [fruit] (-> fruit val :ripe? false?)) fruits))")) 
    fruits) 

我不明白为什么这不会在高级编译工作。不幸的是,它每次只返回nil

难道只是我没有想出一个解决方案或CLJS只是没有能力做到这一点呢?

+0

所以它适用于:简单和:空白?也许在这个方向阅读将有助于:http://www.lispcast.com/clojurescript-externs –

+0

排序...首先它说'水果'没有宣布,但然后它计算结果好吧。我不明白为什么。 –

+1

您可能需要研究extern和出口,并考虑加入cljs懈怠组并在那里询问。 –

回答

0

后的实验小时并努力从字符串评估函数我决定写DSL。

在数据库e我用包含这些参数的地图存储字符串:

  • :哪里? - 包含所需答案的路径的向量。
  • :什么? - 我正在寻找的答案。
  • :严格? (可选) - 一个布尔值。如果为真,则答案需要与:what?规则完全相同(顺序无关紧要)。

然后我只是评估那个简单的cljs文件。它适用于advancednone优化模式。

(defn standard-cond-met? [{:keys [what? where? strict?] 
          :or {strict? false}}] 
    (let [answer (get-in answers (conj where? :values))] 
    (if strict? 
     (= (sort what?) (sort answer)) 
     (clojure.set/subset? 
     (set what?) 
     (set answer))))) 
1

我怀疑你会有不同的困难时间实现你的要求使用 这种方法。最大的问题很可能是因为需要将clojurescirpt编译为javascript(使用Google关闭)。你可能会得到它的工作做一些聪明的东西与外部和使用低级别的JavaScript互操作和封闭库,但我怀疑它会很难 工作。

一对夫妇的这可能是值得的替代方法考虑

  • 储存于EDN格式的数据库中的数据。使用edn,您可以将 读入一个var然后执行它
  • 改变方向 - 您是否真的需要存储完整的功能,或者您是否可以定义一种DSL从数据库中获取参数 将提供必要的动态执行级别。
  • 你可以有某种预处理解决方案,即在 clojurescript中编写函数,但使用闭包函数将其编译为javascript,并将其插入数据库而不是原始clojurescript。这会使数据的初始存储更复杂,但可能会简化在运行时调用动态函数 。您甚至可以包含一些代码检查或验证,以减少从数据库中执行错误操作的代码的可能性。

使用完全动态代码有很多风险,它几乎是 从来没有一个好的解决方案。除了您在 这种方法中遇到的众多安全问题之外,您还必须处理从插入到数据库中的错误定义中产生的问题(例如,定义会导致应用程序崩溃或损坏数据的错误诊断函数 )。必须有动态执行未知的代码 能力,那么至少EDN提供了一些 额外的保护你不EVAL-STR获得 - 但实际上,干脆不要做 它

相关问题