2017-01-23 2 views
1

Rückkehr würde ich auf die Funktion mag (string-place-typeII) den Wert von (calculate-distance-matrix) wie diese zurückzubringen: {:distance "5 km" :duration "2 mins"} auf jeder Schleife oder besser noch gibt sie an eine Variable in {} eingeschlossen, so kann ich alle Rück es am Ende der Schleife.einen Wertes aus einer Schleife in Clojure

Liste der Funktionen:

(defn get-placetypes 
    "" 
    [] (into-array (PlaceType/values))) 

(defn get-all-placetypes 
    "" 
    [x] 
    (def my-vector (get-placetypes)) 
    (let [[& the-rest] my-vector] 
    (nth the-rest x))) 

(defn string-place-typeII 
    "" 
    [] 
    (doseq [n (get-placetypes)] 
    (calculate-distance-matrix 2 (define-context API-KEY) n)) 
) 
(defn calculate-distance-matrix 
    "" 
    [property-id context place-type] 
    ;(def nearby-search-fucntion ) 
    (let [r (. (. (. (DistanceMatrixApi/newRequest 
        context) 
        origins (into-array [(coordinates->keys property-id context)])) 
       destinations (into-array [(m/latlng (do-nearby-search property-id context place-type))])) await)] 

    {:distance (-> r 
        .rows 
        first 
        .elements 
        first 
        .distance 
        .humanReadable) 
    :duration (-> r 
        .rows 
        first 
        .elements 
        first 
        .duration 
        .humanReadable)}) 

Wie ich die (string-place-typeII) gibt den Wert von (calculate-distance-matrix) wie diese {:distance "5 km" :duration "2 mins"} bei jeder Iteration zu machen?

+0

können Sie nicht verwenden 'map' statt' doseq'? Ich benutze 'doseq' nur, wenn 1. der Körper von' doseq' einige Nebenwirkungen hat, 2. Ich habe nichts, was von dort zurückgegeben werden könnte. – andrusieczko

Antwort

0

Bitte bookmarken Sie the Clojure Cheatsheet und halten Sie immer einen Browser Tab offen.

Ich denke, Sie suchen nach der for Funktion anstelle von doseq. doseq ist für Nebenwirkungen (z. B. Drucken, db usw.) gedacht und gibt immer nil zurück. for gibt für jedes Mal ein Element durch die Schleife zurück.

Hier eine Übersicht von dem, was Sie tun können:

(defn calc_dist [n] 
    { :dist (* 2 n) :dur (* 3 n) }) 

(defn caller-1 [] 
    (doseq [n (range 5)] 
    (calc_dist n))) 

(defn caller-2 [] 
    (for [n (range 5)] 
    (calc_dist n))) 

(caller-1) => nil 
(caller-2) => [{:dist 0, :dur 0} {:dist 2, :dur 3} {:dist 4, :dur 6} {:dist 6, :dur 9} {:dist 8, :dur 12}] 

In Bezug auf Ihren (let [r ...) Ausdruck finden Sie the clojure.org section on Java Interop. Ich glaube, Sie werden feststellen, the .. special form ist einfacher zu lesen. Sie sollten auch in Betracht ziehen, the doto function.

+0

Ist 'forv' ein Tippfehler Alan? –

+0

Hoppla. Late-Night-Editing .... verwirrt es mit 'mapv' ... jetzt behoben. –

0

ich mit dem Ersetzen der doseq mit einer for Schleife versuchen würde. Es wird calculate-distance-matrix für jeden Anruf n im (get-placetypes), dann werden die Ergebnisse als Folge verbunden werden:

(defn string-place-typeII 
    "" 
    [] 
    (for [n (get-placetypes)] 
    (calculate-distance-matrix 2 (define-context API-KEY) n)) 
) 
Verwandte Themen