Clojure:如何将字符串形式的矩阵转为整数的向量的向量?
解决方案:把字符串矩阵解析为Clojure结构化数据并调用函数
作为Clojure新手,处理字符串到结构化数据的转换确实容易卡壳,我来帮你一步步搞定这个问题~
核心思路
你现在的卡点是把分割出来的字符串形式矩阵(比如"[[1 2] [3 4]]")转换成Clojure里的整数向量的向量。其实你的矩阵字符串本身就是合法的Clojure语法,直接用Clojure自带的读取器就能把它转成对应的数据结构,不用手动拆分解析,省很多事!
具体实现步骤
1. 字符串转Clojure数据结构
用clojure.edn/read-string函数就能一键转换:
(clojure.edn/read-string "[[1 2] [3 4]]") ; 输出结果:[[1 2] [3 4]] ; 这正是你需要的整数的向量的向量
2. 修改你的文件读取代码
把args里的每个字符串参数都用read-string转换,再传给目标函数。修改后的完整代码如下:
(require '[clojure.string :as str]) (require '[clojure.edn :as edn]) (defn get-lines [fname] (with-open [r (clojure.java.io/reader fname)] (loop [file (line-seq r)] (if-let [[line & remaining-lines] file] (do (let [[command & arg-strings] (str/split line #",") ; 将每个字符串参数解析为Clojure数据结构 parsed-args (map edn/read-string arg-strings) ; 解析要调用的函数符号 target-func (resolve (symbol command))] ; 确保函数存在再调用,避免报错 (when target-func (apply target-func parsed-args))) (recur remaining-lines)) nil))))
3. 测试函数调用
假设你的ijk函数是这样的(简单示例):
(defn ijk [matrixA matrixB] (println "Received Matrix A:" matrixA) (println "Received Matrix B:" matrixB) ; 这里写你的矩阵乘法逻辑 )
当你执行(get-lines "你的输入文件名.txt")时,程序就会正确解析每行的矩阵参数,并调用对应的函数啦。
几个注意点
- 确保输入文件里的矩阵字符串是合法的Clojure语法,比如括号配对、空格正确,否则
read-string会抛出解析错误。 - 如果你的输入来源不可信,不要直接用
read-string(不过自己控制的输入文件完全没问题);如果要处理不可信输入,可以考虑手动拆分字符串解析矩阵,但对于你的场景,edn/read-string是最简单高效的选择。 - 代码里加了
(when target-func ...)的判断,避免因为输入里的命令不存在导致程序崩溃,你也可以根据需求改成报错提示。
内容的提问来源于stack exchange,提问作者Julian Toya Angeles
相关产品推荐
相关产品推荐

