2016-05-17 2 views
0

У меня возникли проблемы Eval-ING в LazySeq возвращенное Deriva:Clojure Eval с функциями Math

(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))) 

, которые могут быть успешно Eval-е изд с помощью 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? Или есть лучший способ оценить выражение?

ответ

0

Возможно, вам нужно использовать java.lang.Math/sin функцию java.