对于课程项目的一部分,我正在实现一个函数来从文件中读取一些数据并根据该文件创建图形结构。一整天我问了几个问题,结果就是这样。
下面是一个可以正常工作的函数。它首先以惰性序列的形式读入文件,然后循环解析每一行并将其打印出来。
(defn printGraph [filename, numnodes]
(with-open [rdr (io/reader filename)]
(let [lines (line-seq rdr)]
(loop [curline (first lines)
restlines (rest lines)]
(println (lineToEdge curline))
(cond (= 0 (count restlines)) curline
:else
(recur (first restlines)
(rest restlines)))))))
这里我使用一个函数lineToEdge
要将文件中的一行解析为图中的一条边,函数如下
(defn lineToEdge [line]
(cond (.startsWith line "e")
(let [split-line (into [] (.split line " "))
first-str (get split-line 1)
second-str (get split-line 2)]
[(dec (read-string first-str)) (dec (read-string second-str))])))
使用此函数和作业提供的其他函数,我可以看出它可以将行解析为正确的格式以将其添加到图形中
finalproject.core> (add-edge (empty-graph 10) (lineToEdge "e 2 10"))
[#{} #{9} #{} #{} #{} #{} #{} #{} #{} #{1}]
所以从这里我可以看出,给定一个解析的行lineToEdge
我可以将其添加到程序所表示的图表中。
现在,当我想将文件中的边添加到图形中时,我的问题就开始了。似乎当我将逻辑添加到函数中以将线条添加到图表中时,我收到错误,但我无法追踪或确定其原因。具有此逻辑的函数如下所示
(defn readGraph [filename, numnodes]
(with-open [rdr (io/reader filename)]
(let [lines (line-seq rdr)]
(loop [graph (empty-graph numnodes)
curline (first lines)
restlines (rest lines)]
(add-edge graph (lineToEdge curline))
(cond (= 0 (count restlines)) graph
:else
(recur (graph)
(first restlines)
(rest restlines)))))))
即使除了尝试将边缘添加到图表中(如果我只是允许)graph (empty-graph numnodes)
在循环中并重复(graph)
从未改变它我仍然得到相同的错误,如下所示
finalproject.core> (readGraphEdges "/home/eccomp/finalproject/resources/11nodes.txt" 11)
ArityException Wrong number of args (0) passed to: PersistentVector clojure.lang.AFn.throwArity (AFn.java:429)
从这里我不确定错误在哪里,我的意思是我可以阅读错误并解释它,但它现在引导我到哪里。 Clojure 堆栈跟踪也没有给我留下任何线索。
谁能确定问题出在哪里?