2016-08-03 17 views
1

Ich spiele mit wit/duckling Bibliothek. Es wurde in clojure geschrieben und ich habe keine Erfahrung in clojure. Durch die nach ihrer Dokumentation habe ich Wert einer Variablen alsZugriff auf LazySeq-Werte

({:dim :time, :body "20 minutes from now", :value {:type "value", :value "2016-08-03T10:50:56.000+05:30", :grain :second, :values ({:type "value", :value "2016-08-03T10:50:56.000+05:30", :grain :second})}, :start 21, :end 40}) 

Nach einiger Google-Suche zu tun kam ich zu wissen, dass es clojure.lang.LazySeq ist und Token mit Doppelpunkt beginnen (:) sind stattdessen Schlüsselwörter von Schlüsseln. Ich möchte auf den Wert zugreifen: Werte Stichwort, ich lese über Clojure Grundlagen zu, aber nicht in der Lage, auf den Wert zugreifen: Werte Stichwort. Ich erwarte, dass es einen Weg geben muss, so dass durch Schreiben lazy_seq [: Werte], bekomme ich seinen Wert. Kann jemand helfen?

Antwort

2

Vorausgesetzt, dass Ihre Sequenz wird durch s bezeichnet:

(get-in (first s) [:value :values]) 

Wenn es in der Folge mehrere Elemente der gleichen Form sein können, und Sie wollen auf einmal alle von ihnen verarbeiten alle :values bekommen, dann

(map #(get-in % [:value :values]) s) 

(Sie müssen nicht über Faulheit kümmern.)

4

Versuchen Sie folgendes:

> (use 'clojure.pprint) 

> (def stuff '({:dim :time, :body "20 minutes from now", :value {:type "value", :value "2016-08-03T10:50:56.000+05:30", :grain :second, :values ({:type "value", :value "2016-08-03T10:50:56.000+05:30", :grain :second})}, :start 21, :end 40})) 

Wir verwenden die „pretty print“ Funktion pprint einen schön verschachtelten Ausgang für die Datenstruktur zu erhalten:

> (pprint stuff) 
({:dim :time, 
    :body "20 minutes from now", 
    :value 
    {:type "value", 
    :value "2016-08-03T10:50:56.000+05:30", 
    :grain :second, 
    :values 
    ({:type "value", 
    :value "2016-08-03T10:50:56.000+05:30", 
    :grain :second})}, 
    :start 21, 
    :end 40}) 

So haben wir eine Liste mit einem Elemente , das ist die Karte der Schlüssel: Dim: Körper: Wert: Start und: Ende. Der Wert für den Schlüssel :value ist eine weitere Schlüsselzuordnung: type,: value,: grain,: values.

Also, um un-Nest dieser,

(pprint (first stuff)) 
{:dim :time, 
:body "20 minutes from now", 
:value 
{:type "value", 
    :value "2016-08-03T10:50:56.000+05:30", 
    :grain :second, 
    :values 
    ({:type "value", 
    :value "2016-08-03T10:50:56.000+05:30", 
    :grain :second})}, 
:start 21, 
:end 40} 

> (pprint (:value (first stuff))) 
{:type "value", 
:value "2016-08-03T10:50:56.000+05:30", 
:grain :second, 
:values 
({:type "value", 
    :value "2016-08-03T10:50:56.000+05:30", 
    :grain :second})} 

> (pprint (:values (:value (first stuff)))) 
({:type "value", 
    :value "2016-08-03T10:50:56.000+05:30", 
    :grain :second}) 

Sie auch die faden erste Makro -> wie folgt verwenden:

> (pprint (-> stuff first :value :values)) 
({:type "value", 
    :value "2016-08-03T10:50:56.000+05:30", 
    :grain :second}) 

so dass die ursprüngliche verschachtelte Struktur stufffließt durch die Funktionen first, :value und :values (in dieser Reihenfolge).

+0

thank u Alan für eine solche gute Erklärung. Ich akzeptierte Yuri Antwort b/c er ließ mich vorstellen, Get-In, die mir sehr geholfen hat. – sdream