++cue
Unpack atom to noun
Produces a noun unpacked from atom a
. The inverse of +jam.
Accepts
a
is an atom.
Produces
A noun.
Source
++ cue~/ %cue|= a=@^- *=+ b=0=+ m=`(map @ *)`~=< q|- ^- [p=@ q=* r=(map @ *)]?: =(0 (cut 0 [b 1] a))=+ c=(rub +(b) a)[+(p.c) q.c (~(put by m) b q.c)]=+ c=(add 2 b)?: =(0 (cut 0 [+(b) 1] a))=+ u=$(b c)=+ v=$(b (add p.u c), m r.u)=+ w=[q.u q.v][(add 2 (add p.u p.v)) w (~(put by r.v) b w)]=+ d=(rub c a)[(add 2 p.d) (need (~(get by m) q.d)) m]
Examples
> (jam [1 2 3])3.426.417> (cue 3.426.417)[1 2 3]
++jam
Pack noun to atom
Produces an atom packed from noun a
. The inverse of +cue.
Accepts
a
is a noun.
Produces
An atom.
Source
++ jam~/ %jam|= a=*^- @=+ b=0=+ m=`(map * @)`~=< q|- ^- [p=@ q=@ r=(map * @)]=+ c=(~(get by m) a)?~ c=> .(m (~(put by m) a b))?: ?=(@ a)=+ d=(mat a)[(add 1 p.d) (lsh 0 q.d) m]=> .(b (add 2 b))=+ d=$(a -.a)=+ e=$(a +.a, b (add b p.d), m r.d)[(add 2 (add p.d p.e)) (mix 1 (lsh [0 2] (cat 0 q.d q.e))) r.e]?: ?&(?=(@ a) (lte (met 0 a) (met 0 u.c)))=+ d=(mat a)[(add 1 p.d) (lsh 0 q.d) m]=+ d=(mat u.c)[(add 2 p.d) (mix 3 (lsh [0 2] q.d)) m]
Examples
> (jam 1)12> (cue 12)1
> (jam [1 1])817> (cue 817)[1 1]
> (jam [~ u=19])39.689> (cue 39.689)[0 19]
++mat
Length-encode
Produces a cell whose tail q
is atom a
with a bit representation of its length prepended to it (as the least significant bits). The head p
is the length of q
in bits.
Accepts
a
is an atom.
Produces
A cell of two atoms, p
and q
.
Source
++ mat~/ %mat|= a=@^- [p=@ q=@]?: =(0 a)[1 1]=+ b=(met 0 a)=+ c=(met 0 b):- (add (add c c) b)(cat 0 (bex c) (mix (end [0 (dec c)] b) (lsh [0 (dec c)] a)))
Examples
> (mat 0xaaa)[p=20 q=699.024]> (met 0 q:(mat 0xaaa))20> `@ub`q:(mat 0xaaa)0b1010.1010.1010.1001.0000> =a =-(~&(- -) `@ub`0xaaa)0b1010.1010.1010> =b =-(~&(- -) `@ub`(xeb a))0b1100> =b =-(~&(- -) `@ub`(met 0 a))0b1100> =c =-(~&(- -) (xeb b))4> [`@ub`a `@ub`(end 0 (dec c) b) `@ub`(bex c)][0b1010.1010.1010 0b100 0b1.0000]
Discussion
mat
is only used internally as a helper to jam
.
++rub
Length-decode
The inverse of mat
. Accepts a cell of index a
and a bitstring b
and produces the cell whose tail q
is the decoded atom at index a
and whose head is the length of the encoded atom q
, by which the offset a
is advanced.
Accepts
a
is an atom.
b
is a bitstring as an atom.
Produces
A cell of two atoms, p
and q
.
Source
++ rub~/ %rub|= [a=@ b=@]^- [p=@ q=@]=+ ^= c=+ [c=0 m=(met 0 b)]|- ?< (gth c m)?. =(0 (cut 0 [(add a c) 1] b))c$(c +(c))?: =(0 c)[1 0]=+ d=(add a +(c))=+ e=(add (bex (dec c)) (cut 0 [d (dec c)] b))[(add (add c c) e) (cut 0 [(add d (dec c)) e] b)]
Examples
> `@ub`(jam 0xaaa)0b1.0101.0101.0101.0010.0000> (rub 1 0b1.0101.0101.0101.0010.0000)[p=20 q=2.730]> `@ux`q:(rub 1 0b1.0101.0101.0101.0010.0000)0xaaa
Discussion
rub
is only used internally as a helper to cue
.