Shakti (k9) tutorial


k9: Manual

This manual is for Shakti (k9) build 2020.12.04.

The Shakti programming language is the work of Arthur Whitney and the team at Shakti. The language comes from a lineage of similar languages going back to APL. It’s also known as k9 given the similarities to k, k2, ..., k6, k7 and the fact that Arthur also wrote those. k9 is still under development so expect a bit of syntax change and likely even more improvements.

Learning k9 means code like {x@(!#x)+\!#y} is clear and actually prefered to something much longer and verbose. You’ll have to go a bit down the rabbit hole before it starts to come together but once it does you’ll probably be happy you gave it a chance and end up learning a few things. You’ll understand how fast k9 can be in processing and analyzing data and how terse code is less likely to contain errors. Unfortunately you will be less likely to be content using more bloated and slow frameworks.

Alas this manual is not as elegant as the k9 language in that the text version of this document is almost as big as the binary of the language.

The built-in reference screen (\) containing all the k9 commands.

*ffi: a:"./"5:`f!"ii";a.f[2;3] / int f(int i,int j){return i+j;}
*k/c: b:"./"5:`f!2   ;b.f[2;3] / K f(K x,K y){return ki(xi+yi);}
`csv?`csv t:,`js?`js d:[d:.z.d;t:.z.t;n:`ab;i:23;f:4.5]
python: import k;k.k('+',2,3); nodejs: require('k').k('+',2,3)

verb                   adverb                  noun
: x         y          f' each      g' each    char " ab"              \l a.k
flip      plus    [x]f/ over      c/ join    name ``ab               \t:n x
minus     minus   [x]f\ scan      c\ splt    int  2 3                \u:n x
first     times   [y]f':eachprior            flt  2 3.4 0w 0n        \v
%           divide     f/:eachright g/:over    date 2021.06.28   .z.d
where     min/and    f\:eachleft  g\:scan    time 12:34:56.789 .z.t
reverse   max/or     
asc       less       i/o (*enterprise)       class                   \f
desc      more       0: r/w line (N;C)0:     list (2;3.4;`c)         \fl x
group     equal      1: r/w char             dict [n:`b;i:2]         \fc x   
not       match     *2: r/w data             func {[a;b]a+b}         \fs x
key       key       *3: k-ipc set            expr :a+b               \cd [d]
enlist    cat       *4: https get
sort   [f]cut       *5: ffi/iff[py/js/..]    table [[]n:`b`c;i:2 3]
count  [f]take                              utable  [[n:`b`c]i:2 3]
floor  [f]drop                      
string    parse      $[b;t;f] cond
unique [n]find                               limit
type   [n]at         @[x;i;f[;y]] amend      name8(*256)
value     dot        .[x;i;f[;y]] dmend      code p8 l8 g32 c128

select A by B from T where Cupdate A from T; delete from T where C
count first last min max sum dot avg var [dev med mode ..]
sqrt sqr exp log sin cos div mod bar in bin
/comment \trace [:return 'signal if do while] \\exit