2017-07-13 85 views
0

Clojure和Ubergraph圖書館的新手,請原諒我,如果這是非常明顯的。嘗試使用Ubergraph加邊功能將邊添加到現有圖。下面的代碼按預期工作:爲什麼我無法將邊緣添加到現有的Ubergraph圖形中?

(def graph1 (uber/graph [:a :b])) 
(uber/pprint (uber/add-edges graph1 [:a :c])) 

...產生如下:

3 Nodes: 
     :a 
     :b 
     :c 
2 Edges: 
     :a <-> :b 
     :a <-> :c 

然而,這樣的:

(def graph1 (uber/graph [:a :b])) 
(uber/add-edges graph1 [:a :c]) 
(uber/pprint graph1) 

生產:

2 Nodes: 
     :a 
     :b 
1 Edges: 
     :a <-> :b 

第二邊緣不會被添加,雖然文件認爲這是正確的。我究竟做錯了什麼?

回答

2

實際上,(uber/add-edges graph1 [:a :c])在兩個示例中都會返回一個全新圖形,而graph1保持不變。在第一種情況下,您正在打印結果。在第二種情況下,你不這樣做,實際上你正在浪費這張新圖並打印graph1。在使用functional programming時,這是一種正常行爲,這適用於immutable datafunctions with no side effects概念。

+0

謝謝,我懷疑可能是這種情況。我想迭代地將節點和邊「追加」到單個圖中。我如何做到這一點,而不會結束一系列重複的圖形?我能以某種方式用遞歸函數來做到這一點嗎? – aethernaut

+0

它確實取決於何時添加節點和邊緣。但是,通常你會使用' - >'迭代地連接,並使用'let'或者'def'賦值給另一個var。你可以創建一個'atom'和'swap!'它的值。 – guijob

+1

太好了,謝謝你的帶領! – aethernaut

相關問題