【发布时间】:2015-03-28 18:24:32
【问题描述】:
对于一个类项目的一部分,我正在实现一个从文件中读取一些数据并基于文件创建图形结构的函数。一整天我都问了几个问题,结果就是这样。
下面是一个可以正常工作的函数。它首先以惰性序列的形式读入文件,然后在序列上循环解析每一行并将其打印出来。
(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 堆栈跟踪也没有给我留下任何线索。
谁能确定问题出在哪里?
【问题讨论】:
-
对于初学者,你需要
graph,而不是(graph)。graph也是不可变的,所以你的add-edge调用什么也不做(除非它有副作用)。
标签: clojure