如何在ClojureScript中正确调用math.js的dot与inv函数?
在ClojureScript中正确调用math.js的dot和inv函数
问题说明
在ClojureScript中使用math.js时,调用math/dot和math/inv出现函数未定义错误,报错提示:
shadow.js.shim.module$mathjs.dot is not a function. shadow.js.shim.module$mathjs.inv is not a function.
错误原因
- 导入方式与math.js导出结构不匹配:math.js的核心函数支持命名导入,默认导出对象可能因版本或打包方式,导致函数无法直接通过
math/xxx的形式访问; - 数据结构不兼容:ClojureScript的
PersistentVector无法被math.js直接识别,需要转换为原生JS数组才能被正确处理。
解决步骤
1. 调整导入方式
推荐使用命名导入直接引入所需函数,更符合ClojureScript的使用习惯:
(:require ["mathjs" :refer [dot inv]] [cljs.core :refer [clj->js]])
若需保留math.js的其他全局功能,可同时保留默认导入:["mathjs" :as math]。
2. 转换数据结构
使用ClojureScript内置的clj->js函数,将ClojureScript向量/矩阵转换为原生JS数组,确保math.js能正确解析输入数据。
修正后的完整代码
(ns numerical-methods.test (:require ["mathjs" :refer [dot inv]] [cljs.core :refer [clj->js]])) ;; 创建并打印向量 (defn a-vector [] (let [v [1.0 2.0 3.0]] (println "Vector:" v))) ;; 计算并打印两个向量的内积 (defn inner-product-demo [] (println "Dot product of two vectors") (let [v1 [1.0 2.0] v2 [3.0 4.0] product (dot (clj->js v1) (clj->js v2))] (println "Inner Product:" product))) ;; 求矩阵逆并打印 (defn invert-matrix [] (println "Invert a matrix") (let [A [[1 2 3] [6 5 4] [8 7 9]] Ainv (inv (clj->js A))] (println "Inverse Matrix:") (println Ainv))) ;; 主函数运行示例 (defn -main [] (println "Chapter 1 demos") (a-vector) (inner-product-demo) (invert-matrix)) ;; 执行主函数 (-main)
额外排查点
若仍出现函数未定义问题,可按以下步骤验证:
- 确认已正确安装math.js:执行
npm install mathjs; - 检查math.js版本:部分旧版本函数命名有差异(如
inv可能需使用inverse),建议安装最新稳定版; - 在REPL中直接验证导入:执行
(require ["mathjs" :as math])后,用(js/console.log math)查看导出对象的属性,确认函数是否存在。
内容的提问来源于stack exchange,提问作者madeinQuant
相关产品推荐
相关产品推荐

