2016-04-24 5 views
1

Ich habe 2 Karten:Mitarbeiter Ergebnis der Operation an den hashmap Wert

(def look {"directions" :look 
     "look" :look 
     "examine room" :look 
     }) 

(def quit {"exit game" :quit 
     "quit game" :quit 
     "exit" :quit 
     "quit" :quit 
     }) 

, die in einer Karte zusammengefasst sind:

(defn actions [] (merge look quit)) 

und dann versuche ich, ihr Ergebnis zu verbinden (was a Hash-Karte) in Wert einer anderen Karte:

(assoc {} :1 actions) 

aber statt erwartetem Ergebnis, das sein sollte:

{1: {"directions" :look, "look" :look ... 

I erhalten

{:1 #object[fun_pro.core$actions 0x20a8027b "[email protected]"]} 

, die, wie ich Bezug auf das Aktionsobjekt zu verstehen.

Was soll ich tun, um das erwartete Ergebnis zu erhalten? Ich habe auch versucht, unquote-splicing zu verwenden, aber ich bin noch nicht fortgeschritten genug, um Makros zu benutzen und konnte es nicht funktionieren lassen.

EDIT1:

OK, es scheint ich die Lösung gefunden. Anstatt (defn actions...) zu verwenden, sollte ich (def actions...) verwenden.

EDIT2:

Um zu klären, warum ich eine solche Struktur verwenden.

Wie ich im Kommentar unten sagte, werde ich diese Karten verwenden, um es mit der Antwort zu vergleichen, die vom Benutzer zur Verfügung gestellt wird, um zu finden, welcher Befehl zu verwenden ist. Zum Beispiel, wenn der Benutzertyp "Zeige mir Richtungen", wird die Funktion ausgelöst, um Richtungen basierend auf dem Schlüsselwort "Richtungen" anzuzeigen. Das gleiche Ergebnis wird sein, wenn der Benutzer "Ich schaue mich im Raum um" oder "Ich prüfe den Raum, um eine Straße zu finden" basierend auf den Schlüsselwörtern "Schau" und "Zimmer untersuchen" fragen werde.

Es wird getan, indem zuerst die Benutzereingabe in einen Satz von Strings aufgeteilt wird und festgestellt wird, ob es ein gemeinsames Wort mit Schlüsseln von meiner Karte gibt (in einen Satz umgewandelt). So wird der Eingang "show me directions" in den Satz #{"show" "me" "directions"} verarbeitet. Dann werde ich clojure.set/intersection verwenden, um herauszufinden, ob es ein gemeinsames Element mit einem Satz von Map-Schlüsselwörtern gibt und die entsprechende Triggerfunktion (ich habe dafür bereits einen Algorithmus programmiert).

Natürlich bin ich offen für irgendwelche Vorschläge, wenn es eine bessere Lösung dafür gibt.

+0

Ihre Karte ist rückwärts. Verwende Symbole als Schlüssel, nicht als Werte. Je nachdem, was Sie tun möchten, ist eine Karte möglicherweise nicht die richtige Wahl. – jmargolisvt

+1

@jmargolisvt Was? Warum würden Sie sagen, dass seine Karte rückwärts ist, nur weil sie Strings den Schlüsselwörtern zuordnet? Eine schnelle Überprüfung seiner Daten macht deutlich, was er vorhat. –

+2

@MarcinKruglik Da Sie die Lösung gefunden haben, könnten Sie es als Antwort anstatt als Bearbeitung der Frage posten? –

Antwort

1

OK, Es scheint, dass ich die Lösung alleine gefunden habe. Anstatt (defn actions...) zu verwenden, sollte ich (def actions...) verwenden.

Diese Ergebnisse der gewünschten Ausgabe.