Ontology asks, What exists?,
to which the answer is Everything.
— W.V.O. Quine, Word and Object
q)/Oh what a lovely day
q)2+2 /I know this one 4
/ Oh what a beautiful morning Oh what a wonderful day \ a:42 \ ignore this and what follows the restroom at the end of the universe
An atom is a single number, character, boolean, symbol, timestamp… a single instance of any datatype.
Lists are zero or more items, separated by semicolons, and enclosed in parentheses. An item can be any noun.
q)count(42;`ibm;2012.08.17) /list of 3 items 3
A list may have 0, 1 or more items.
q)count() /empty list 0 q)count enlist 42 /1-list 1 q)count(42;43;44;45) /4-list 4
An atom is not a 1-list
A list with 1 item is not an atom. The
enlist function makes a 1-list from an atom.
q)42~enlist 42 0b
A list item may be a noun, function or adverb.
q)count("abc";0000111111b;42) /2 vectors and an atom 3 q)count(+;rotate;/) /2 operators and an adverb 3
In a vector (or simple list) all items are of the same datatype. Char vectors are also known as strings.
Attributes are metadata that apply to lists of special form. They are often used on a dictionary domain or a table column to reduce storage requirements or speed retrieval.
The byte overheads use
n (number of elements) and
u (number of uniques).
`uis for unique lists.
`gare for lists with a lot of repetition.
`g# are preserved on append in memory, if possible.
`s# is preserved on append to disk.
To set or unset an attribute:
q)`s#1 2 3 `s#1 2 3 q)`#`s#1 2 3 1 2 3
Setting or unsetting an attribute other than
upg, causes a copy of the object to be made. Setting/unsetting the
s attribute on a list which is already sorted will not cause a copy to be made, and hence will affect the original list in-place. Setting the
s attr on a dictionary or table, where the key is already in sorted order, in order to obtain a step-function, causes the
s attribute to be set in place for the key but copies the outer object.
q)t:([1 2 4]y:7 8 9);`s#t;attr each (t;key t) ``s
A dictionary is a map from a list of keys to a list of values. (The keys should be unique, though q does not enforce this.) The values of a dictionary can be any data structure.
q)/4 keys and 4 atomic values q)`bob`carol`ted`alice!42 39 51 44 bob | 42 carol| 39 ted | 51 alice| 44 q)/2 keys and 2 list values q)show kids:`names`ages!(`bob`carol`ted`alice;42 39 51 44) names| bob carol ted alice ages | 42 39 51 44
A dictionary in which the values are all lists of the same count can be flipped into a table.
q)count each kids names| 4 ages | 4 q)tkids:flip kids / flipped dictionary names ages ---------- bob 42 carol 39 ted 51 alice 44
Or the table specified directly using table syntax, e.g.
q)/a flipped dictionary is a table q)tkids~(names:`bob`carol`ted`alice; ages:42 39 51 44) 1b
Table syntax can declare one or more columns of a table as a key. The values of the key column/s of a table are unique.
q)([names:`bob`carol`bob`alice;city:`NYC`CHI`SFO`SFO]; ages:42 39 51 44) names city| ages ----------| ---- bob NYC | 42 carol CHI | 39 bob SFO | 51 alice SFO | 44
Names and namespaces¶
A namespace is a container or context within which a name resolves to a unique value. Namespaces are children of the root namespace (usually just root) and are designated by a dot prefix. Names in the root have no prefix. The root namespace of a q session is parent to multiple namespaces, e.g.
z. (Namespaces with 1-character names – of either case – are reserved for use by Kx.)
q).z.p / UTC timestamp 2017.02.01D14:58:38.579614000
Namespaces are dictionaries
Namespace contents can be treated as dictionary entries.
q)v:5 q).ns.v:6 q)
.[v] / value of v in root namespace 5 q)
.ns[v] / value of v in ns 6 q)
.v / indexed by juxtaposition 5 q)
v 6 6 q).
.ns@\:v 5 6
- operators and primitive functions, eg
- as defined in the lambda notation, eg
- as derived from (1) and (2) by adverbs, eg
- q-SQL functions, e.g.
Functions are first-class objects and can be passed as arguments to other functions. Functions that take other functions as arguments are known as higher-order functions.
The following reserved words denote functions that are not also operators.
.Q.res (reserved words)
Operators are primitive binary functions that may be applied infix.
q)|[2;3] / maximum, prefix form 3 q)2|3 / maximum, infix form 3 q)rotate[2;0 1 2 3 4 5] / prefix form 2 3 4 5 0 1 q)2 rotate 0 1 2 3 4 5 / infix form 2 3 4 5 0 1
Operators are denoted by glyphs or reserved words or both – see note below on minimum and maximum. (They cannot be defined using the lambda notation.)
|less than||less than or equal||greater than||greater than or equal|
|take||join||fill; coalesce||drop; cut|
|dict; key; enumerate; ints to enum; update; delete|
Minimum and maximum
The minimum operator is denoted by both the
& glyph and the reserved word
and. The maximum operator is denoted by both the
| glyph and the reserved word
The following reserved words denote operators.
.Q.res (reserved words)
Adverbs are primitive higher-order functions: they return derivatives (derived functions). They are denoted by six overloaded glyphs:
q)+/[2 3 4] / reduce 2 3 4 with + 9 q)*/[2 3 4] / reduce 2 3 4 with * 24
The control words
while govern evaluation.
A view is a calculation that is re-evaluated only if the values of the underlying dependencies have changed since its last evaluation. Views can help avoid expensive calculations by delaying propagation of change until a result is demanded.
The syntax for the definition is
The act of defining a view does not trigger its evaluation.
A view should not have side-effects, i.e. should not update global variables.
Expressions beginning with
\ are system commands or multiline comments (see above).
q)/ load the script in file my_app.q q)\l my_app.q
A script is a text file; its lines a list of expressions and/or system commands, to be executed in sequence. By convention, script files have the extension
Within a script
- function definitions may extend over multiple lines
- an empty comment begins a multiline comment.