2016-10-19 37 views
0

內我已經得到了實現這樣的多方法命名空間:多個名稱空間;試圖調用方法於一體,輸出傳遞到另一個方法3方法

(ns a) 
(defmulti funca (fn [system data] system)) 
(defmethod funca :add-z 
    [system data] 
    (conj data {:z 26})) 

我有一個命名空間的第二次實施不同的多重方法:

(ns b) 
(defmulti funcb (fn [system data new-element] system)) 
(defmethod funcb :add-element 
    [system data new-element] 
    (conj data new-element)) 

我得定義爲

(ns c 
    (:require [a :refer [funca]] 
      [b :refer [funcb]])) 

我想創建命名空間下的方法,我可以一個第三命名空間調用爲例如

(funcc (funca :add-z {:a 1 :b 2 :c 3}) 
     (funcb :add-element {:y 25})) 

這應該採取的(funca :add-z {:a 1 :b 2 :c 3})結果(這將是{:a 1 :b 2 :c 3 :z 26}),並使用該結果作爲輸入到(funcb :add-y-and-count-elements {:y 25}),其然後將返回的結果{:a 1 :b 2 :c 3 :y 25 :z 26}

在試圖定義funcc,我試圖像

(ns c 
    (:require [a :refer [funca]] 
      [b :refer [funcb]])) 
(defn funcc [funca funcb] 
    (partial funcb funca)) 

事情
(defn funcc [funca funcb] 
    (funcb (funca))) 

(defn funcc [funca funcb] 
    (-> funca 
     funcb)) 

但是當在REPL運行任何這些和調用funcc,我得到

數錯誤參數的個數(2)傳遞到:B/eval19367/FN

什麼是正確的語法用於定義funcc,因此,它可能需要傳遞給它的第一個參數的輸出,用它作爲第二個參數的輸入,然後返回結果?

回答

0

這應該採取的(funca :add-z {:a 1 :b 2 :c 3})結果(這將是{:a 1 :b 2 :c 3 :z 26}),並使用該結果作爲輸入(funcb :add-y-and-count-elements {:y 25}),然後將返回的結果{:a 1 :b 2 :c 3 :y 25 :z 26}

根據這個描述你的funcc實際上只接受一個參數(調用funca的結果),因此它應該這樣來定義:

(defn funcc [data] 
    (funcb :add-element data {:y 25})) 

和叫它:

(funcc (funca :add-z {:a 1 :b 2 :c 3})) 

如果你總是想調用funcc與應用add-z一些數據的funca的結果,你可以將其更改爲:

(defn funcc [data] 
    (let [result-from-funca (funca :add-z data)] 
    (funcb :add-element result-from-funca {:y 25}))) 

,並稱之爲:

(funcc {:a 1 :b 2 :c 3}) 
0

使用as->宏

(as-> {:a 1 :b 2 :c 3} data 
    (funca :add-z data) 
    (funcb :add-element data {:y 25})) 

如果funcafuncb接受第一個參數位置的數據,則可以使用->箭頭。如果兩個數據都處於最後位置,則可以使用->>甚至comp,例如, G。

(def funcc (comp (partial funcb :add-element {:y 25}) 
       (partial funca :add-z))) 

取決於什麼類型的轉換將成爲你正在寫的功能最有用,規避設計Clojures共同組成工具,是箭頭和補償他們的簽名。

相關問題