2017-02-01 4 views
0

Ich bin ein Neuling in clojure, also bitte bitte mit mir.clojure - probleme zerstörung map innerhalb makro

Schreiben eines Makros wie so:

`(let [query# (:query-params ~'+compojure-api-request+) 
     options# (select-keys query# [:sort-by :from :to])]) 

Erste Zeile des let Block destructures ein query-params von http request -, die diese Struktur erzeugt:

{sort-by billing-account/name, from 0, to 10, payment-due , payment-method , search }

Und das Problem ist, mit dem zweiten Linie - es gibt eine leere Karte zurück, wenn ich select-keys verwende, aber wenn ich zum Beispiel (first query#) sage - sieht die Ausgabe so aus: [sort-by billing-account/name]

Könnte jemand bitte erklären, warum die select-keys nicht funktioniert?

P.S. Versucht (get query# :from) & (:from query#) - auch dort kein Glück.

UPD

Keys waren Saiten, nicht Schlüsselwörter - also Strings als Schlüssel mit nur gut funktioniert.

+0

Sind Sie sicher, dass die Schlüssel in der Karte Schlüsselwörter und keine Symbole oder Zeichenfolgen sind? – Lee

+0

@Lee gerade meine Frage bearbeitet, ja, sie waren Symbole. – Sasha

Antwort

1

By the way, können Sie auch denaturiert, String-Schlüssel mit :strs:

(let [m {"sort-by" "billing-account/name", 
     "from" "0", 
     "to" "10", 
     "payment-due" nil, 
     "payment-method", "search"} 
     {:strs [sort-by from to payment-due payment-method]} m] 
    (println sort-by from to payment-due payment-method)) 

;;=> billing-account/name 0 10 nil search  

Siehe https://clojure.org/guides/destructuring für eine vollständige Beschreibung der Destrukturierung Syntax.

0

Ich denke, Sie sind durch die Unterschiede zwischen Stichwörtern, Symbolen und Strings verwirrt. In deinem Kommentar sagst du, dass sie Symbole sind, aber in deiner Bearbeitung sagst du, dass es Strings sind.

Sie sollten auf der Differenz nachlesen:

Die idiomatische Sache ist in der Regel bevorzugen Keywords als Mapkeys verwenden, obwohl Sachen, die aus dem Internet kommt (JSON, HTTP-Header usw.) sind manchmal alle Zeichenfolgen.

Um Ihre Frage direkt zu beantworten, müssen die an select-keys übergebenen Schlüssel gleich sein (unter Verwendung der =-Funktion) zu denen in der Karte, so dass sie in diesem Fall vom gleichen Typ sein müssen.

;; For example 

(select-keys {'foo 1 'bar 2} ['foo]) ;=> {foo 1} 

(select-keys {:foo 1 :bar 2} [:foo]) ;=> {:foo 1} 

(select-keys {"foo" 1 "bar" 2} ["foo"]) ;=> {"foo" 1} 

Auch ich Frage die Notwendigkeit für diese ein Makro sein, gibt es einen Grund, dass eine einfache Funktion nicht funktioniert?

+0

Hallo, vielen Dank für die Antwort, nein nicht verwirrt, Tippfehler, ich habe versucht, den Kommentar zu bearbeiten, aber es hat mich nicht lassen :-( – Sasha