具有数学函数的Clojure评估

时间:2016-05-17 10:22:17

标签: clojure eval leiningen clojure-repl

我在评估Deriva返回的LazySeq时遇到了问题:

-XX:+PrintGCDetails -XX:+TraceClassUnloading -XX:+TraceClassLoading

返回LazySeq

(use 'clojure.core.matrix)
(use 'com.lambder.deriva.core)

(def f1 '(cos (* x y)))
(def f2 '(sin (* x y)))
(def f [f1 f2])
(def u ['x 'y])
(def x 4)
(def y 3)
(defn jacobian [f u]
    (map #(partial-derivative f %) u)
)

可以使用REPL成功评估:

((vector (* (* -1 (sin (* x y))) y) (* (cos (* x y)) y)) (vector (* (* -1 (sin (* x y))) x) (* (cos (* x y)) x)))

得出正确的矩阵

(eval (into [] (jacobian f u)))

如果我将eval放在clj文件中并[[1.609718754001305 2.5315618761974763] [2.1462916720017398 3.3754158349299686]]

lein run

我得到(defn -main [] (eval (into [] (jacobian f u))) ) ,因为Exception in thread "main" java.lang.RuntimeException: Unable to resolve symbol: sin in this context, compiling:(/tmp/form-init2786363415298022761.clj:1:113)在不同的命名空间中工作。

有没有办法在eval生成的临时命名空间中包含clojure.math函数?或者有更好的方法来评估表达式吗?

2 个答案:

答案 0 :(得分:0)

也许你需要使用java的java.lang.Math / sin函数。

答案 1 :(得分:0)

考虑使用syntax-quote(`)而不是引用(')来获取完全限定的符号,以后可以进行评估:

's
=> s
`s
=> user/s

在此处查看有关引用的更多信息: https://blog.8thlight.com/colin-jones/2012/05/22/quoting-without-confusion.html