2017-06-15 3 views
0

I view entweder durch Laden aq Skript definieren kann, oder interaktiv von der Konsole:[KDB +/Q]: (Re-) programmatisch Ansicht definieren (dynamisch)

q)myview::a+b    /even semi-programmatically using ugly strings: value"myview::a+b" 

Einige Exploration:

q)value `. `myview 
:: 
(+;`a;`b) 
`a`b 
"a+b" 

kann ich sehen, dass meine neu gestaltete Ansicht nun Teil der globalen Umwelt Wörterbuch ist:

q)select myview from `. 
myview| a+b 

Der Wert Teil dieser Schlüssel-Wert-Paar ist eine Liste der Lambda-Typen:

q)-3!value select myview from `. 
",a+b" 
q) type first value select myview from `. 
100h 

Obwohl {a+b} Lambda-Typ als auch ist ...

q)type {a+b} 
100h 

... die a+b und {a+b} nicht das gleiche:

q){a+b} ~ first value select myview from `. 
0b 

Frage: Nun, da myview ist definiert in der globalen Umgebung, wie kann ich seine Definition programmgesteuert ändern, um a+c Lambda-Ausdruck zu sagen, indem auf diese Ansicht namentlich verwiesen wird, d.h. `myview?

Zum Beispiel kann ich will diesen Eingang verarbeiten:

q)config:()!(); config[`myview]:"a+c" 

Antwort

1

Ansichten sind nicht parseable (siehe die letzte Zeile an http://code.kx.com/q/tutorials/views/), so scheint es, dass „mit hässlichen strings“ Ihre einzige Option ist:

q)show config:`view1`view2!("a+b"; "c+d") 
view1| "a+b" 
view2| "c+d" 
q)defView:{value string[x],"::",y} 
q)defView'[key config; value config] 
q)\b 
`s#`view1`view2 
q)view1 
'b 
q)a:1;b:2 
q)view1 
3 
0

Ist wie etwas das erreichen, was Sie suchen?

q)f:{value "::" sv (string x;y)} 
q)f[`myview;"a+b"] 
q)select myview from `. 
myview| a+b 
+0

Dank, jede mögliche Weise Ausdrücke anstatt String-Manipulation unter Verwendung von ? '' Meine Ansicht; a + c] '' würde '' c' Fehler werfen. Und das Verkapseln von Ausdruck in geschweiften Klammern '{a + c}', um die Auswertung zu verzögern, ist offensichtlich etwas anderes. Ich kann meinen Kopf nicht dazu bringen, die rechte Seite von 'myview | zu manipulieren a + c' –