In Clojure, wie man alle Schlüssel einer Karte zerstört?

8

In diesem Fall ist es möglich, einige Schlüssel einer Karte wie folgt zu destrukturieren:

%Vor%

Gibt es eine Möglichkeit, alle die Schlüssel einer Karte zu destrukturieren?

Vielleicht etwas wie:

%Vor%     
viebel 18.02.2012, 23:15
quelle

3 Antworten

22

Nicht wirklich, und es wäre keine gute Idee. Stellen Sie sich vor:

%Vor%

Sind foo und bar globals? Einheimische? Schlüssel, die Sie aus m extrahieren sollten? Was sollte dieser Code tun, wenn m manchmal einen foo-Schlüssel enthält und foo auch eine globale Funktion ist? Manchmal rufst du das globale an und manchmal rufst du die in m gespeicherte Funktion auf?

Ignorieren Sie die technischen Probleme (von denen die meisten wahrscheinlich überwunden werden können), ist es wirklich ein Desaster für Lesbarkeit und Vorhersagbarkeit. Sei nur klar darüber, welche Schlüssel du herausziehen möchtest; Wenn Sie häufig die gleichen zehn Schlüssel ziehen möchten, können Sie ein einfaches Makro wie (with-person p body) schreiben, das diesen allgemeinen Fall für Sie vereinfacht.

    
amalloy 18.02.2012, 23:55
quelle
7

Diese Frage ist ziemlich alt, also hast du sie wahrscheinlich vergessen, aber sie ist auf Google aufgetaucht, als ich versucht habe, dasselbe zu tun. Wenn ich also meine Lösung poste, könnte das jemand anderem helfen.

%Vor%

Dies transformiert im Grunde die Map {:cpp 88 :js 90} in die bindende Form [cpp 88 js 90] und erstellt dann eine let -Bindung, zusammen mit einigen Eval-Jitsu, um sicherzustellen, dass dies zur Laufzeit geschieht.

%Vor%     
one-more-minute 25.06.2012 01:01
quelle
6

Sie könnten dafür ein Makro schreiben (effektiv ein Mini-DSL erstellen), aber ich denke nicht, dass es aus folgenden Gründen eine sehr gute Idee ist:

  • Um die richtigen Literale für die Kompilierungszeit js und cpp zu erstellen, müssten Sie die Map zur Kompilierungszeit destrukturieren. Dies wäre ziemlich einschränkend in Bezug darauf, was Sie damit tun könnten (Sie müssten die Schlüssel im Voraus spezifizieren, und sie könnten beispielsweise nicht in Funktionen höherer Ordnung verwendet werden)
  • Makros sind im Allgemeinen eine schlechte Idee, wenn eine einfachere Methode die Aufgabe erfüllen würde (siehe unten)

Ich würde empfehlen, in Ihrem Fall einfach einen einfachen doseq zu verwenden, um die Karte zu durchlaufen:

%Vor%

Beachten Sie Folgendes:

  • Sie können das Destrukturieren wie oben verwenden, um sowohl den Schlüssel k als auch den Wert v von jedem Karteneintrag
  • zu extrahieren
  • Ich habe doseq anstatt für , weil es nicht faul ist und es scheint, dass Sie in diesem Beispiel die Schleife nur für println Nebenwirkungen.
  • Wenn Sie stattdessen eine lazy Folge von Werten (88 90) möchten, dann wäre für angemessen.
mikera 19.02.2012 00:19
quelle

Tags und Links