Clojure eval с математическими функциями

У меня проблемы с проверкой LazySeq, возвращенного Deriva:

(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? Или есть лучший способ оценить выражение?

2 ответа

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

Попробуйте использовать синтаксис-кавычку (`) вместо кавычки ('), чтобы получить полностью определенные символы, которые вы сможете позже оценить:

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

Подробнее о цитировании можно узнать здесь: https://blog.8thlight.com/colin-jones/2012/05/22/quoting-without-confusion.html

Другие вопросы по тегам