0

我在评估 Deriva 返回的 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)
)

返回一个 LazySeq

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

可以使用 REPL 成功评估:

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

产生正确的矩阵

[[1.609718754001305 2.5315618761974763] [2.1462916720017398 3.3754158349299686]]

如果我将 eval 放在 clj 文件中并且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 函数包含在 eval 生成的临时命名空间中?还是有更好的方法来评估表达式?

4

2 回答 2

0

考虑使用语法引号 (`) 而不是引号 (') 来获得您以后可以评估的完全限定符号:

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

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

于 2016-05-17T19:21:34.680 回答
0

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

于 2016-05-17T11:01:49.363 回答