What follows is an in-depth look at the specs of the ayr
array language, so any individual can gain knowledge of how the language works.
ayr
uses the based array model, similar to BQN. Values can be scalars, vectors, matrices, etc. These correspond to rank 0, 1, and 2 data respectively.
Note: higher rank data will be supported in the future
<2 3 6
[ 2 3 6 ]
1
1
1 2 3 ; _4 5 11
1 2 3
_4 5 11
General types come in the form of signed floats and strings, which may or may not be scalar values. A vector, similar to APL, is denoted with a series of these general values separated by spaces. To create a matrix, you can currently use ;
to separate vectors or grouping (()
) similar to how APL generally does it.
Incomplete operations within groups or assigned to a variable are called Trains. Binders are left-assosciative, while symbols are right-assosciative.
ayr also supports block syntax, which can take one or two variables. The right variable is y
, and the left is x
. For example:
{{ 3 * y }} 4
12
These can be used in any place any other symbol or group could also be used.
NL.
can be used as a line separator, and DS.
is used to denote comments
Numbers are the basis of an array language. ayr
supports an array of numeric literals, and will support more in the future.
In short, the rules can be summarized by this regex:
((?:_?\d*)?r_?\d+)|^(__|(?:_?\d*\.?\d*)?e?_?\d*\.?\d+|_)
_
represents a negative sign. Literal floats and scientific notation are supported. For example,
e2
100
_3.76
_3.76
ayr
also supports rational literals, such as 5r4
(5/4
) and r3
(1/3
)
Furthermore, ayr supports strings, albeit in a form nearly indistinguishable from numbers. For example, 'hello world' + 3
will print a string where each character is offset from 3 by the string hello world
. Character matrices and higher rank data is also supported. To display a string in numeric form, you can use the +
prefix.
Data in general within ayr, like other array languages, is in the form of arrays. For instance, strings are just arrays of numbers. Every array has rank; that is, the shape of the array. For example, an array of rank 3 2
would look like this:
0 0 0
0 0 0
As an array gains dimensions, these are represented by a new number being appended to the rank, representing the depth in that dimension. This array has 3
rows and 2
columns. An array that contains two 3 2
arrays would have the shape 3 2 2
, and so on.
These could also be referred to as axes: the first axes is the newest dimension; in this case being the columns. A one dimensional array's first axes would be its row.
A symbol refers to a built in ascii symbol that denotes a monadic/dyadic operation. A binder refers to a symbol that monadically and/or dyadically takes a symbol and does something with them. For example, take the +
(add) symbol, -
(subtract/negate) symbol, >
(first) symbol, and the &
(atop) binder:
1 2 + 3
4 5
> 1 2 3
1
1 2 3 -&+ 4 5 6
_5 _7 _9
Basic control flow can be achieved in ayr through the use of :
. In general,
COND : IF
ELSE
is equivalent to JS'
if (COND) { IF }
else { ELSE }
User functions refer to, as the name implies, functions defined by the user. For instance,
add: +
4 add 5
9
They are defined with the syntax <name> : <expression>
. These can be constant values, incomplete trains, blocks, etc.
There are two types of trains: partial trains and J-style trains. First the default, J-style:
Key: lowercase letters represent symbols and uppercase represent immediates
(f g) A -> f g A
A (f g) B -> A f g B
(A f) B -> A f B
(f g h) A -> (f A) g h A
A (f g h) B -> (A f B) g A h B
(f g h i) A -> f (g A) h i A
..etc
Note that this is not an exhaustive list, there may be some edge cases not included.
Furthermore, there are currently 3 tokens used in J-style trains that have special meaning:
([: f g) -> f & g
(]: f g) -> f &: g
(`: f) -> f`
Partial trains are also present in ayr
, and are usable by prefixing a train with :
. For example:
(: f g h) A -> f g h A
A (: f g h) B -> f g A h B
Partial trains, of course, support constants within them too.
Symbol | Monadic | Rank | Dyadic | Rank | Notes |
---|---|---|---|---|---|
+ |
Abs | 0 | Add | 0 0 | Str(m): converts to nums |
+. |
TODO | TODO | GCD | 0 0 | |
+: |
Double | 0 | Abs Add | 0 0 | |
- |
Negate | 0 | Subtract | 0 0 | Str(m): swaps case |
-. |
Permute | 99 | Unintersect | 99 99 | |
-: |
Halve | 0 | Abs Diff | 0 0 | |
* |
Signum | 0 | Multiply | 0 0 | Str(m): case sig (1 _1 0 = *'Ab ' ) |
*. |
Factors | 0 | LCM | 0 0 | |
*: |
Square | 0 | N * |N| | 0 0 | |
% |
Reciprocal | 0 | Divide | 0 0 | |
%. |
TODO | TODO | TODO | TODO | |
%: |
Square Rt | 0 | Nth Root | 0 0 | |
| |
Boolean Not | 0 | Residue | 0 0 | |
|. |
Reverse | 1 | Rotate | 0 1 | |
|: |
Descend | 0 | Axes | 1 99 | |
! |
Factorial | 0 | Binomial | 0 0 | |
< |
Cover | 99 | Less Than | 0 0 | |
<. |
Sort Ascending | 1 | Nor | 0 0 | |
<: |
Grade Up | 1 | Less/Eq | 0 0 | |
> |
Uncover | 99 | Greater Than | 0 0 | |
>. |
Sort Descending | 1 | Nand | 0 0 | |
>: |
Grade Down | 1 | Greater/Eq | 0 0 | |
^ |
Exp | 0 | Pow | 0 0 | |
^. |
Up Reverse | 99 | And | 0 0 | |
^: |
Ceiling | 0 | Max | 0 0 | Str(m): uppercase |
$ |
Shape | 99 | Reshape | 99 99 | |
[ |
Identity | 99 | Left | 99 99 | |
[. |
Nudge Left | 1 | Couple | 99 99 | |
] |
Identity | 99 | Right | 99 99 | |
]. |
Nudge | 1 | Couple Back | 99 99 | |
? |
Dedup Sieve | 99 | Group | 99 1 | |
?. |
Roll | 0 | Deal | 1 99 | |
?: |
Shuffle | 1 | Without | 99 99 | m: [#(:,^./^./&,&~:\) |
= |
Transpose | 2 | Equality | 0 0 | |
=. |
All Equal | 99 | Xor | 0 0 | |
=: |
Eval | 99 | Match | 99 99 | |
~ |
One-Range | 0 | Index | 99 99 | Str(m): alphabet upto arg |
~. |
Indices | 99 | Interval Ind | 0 1 | |
~: |
Unique | 99 | Unequality | 0 0 | |
, |
Ravel | 99 | Concatenate | 1 1 | |
,. |
Determinant | 2 | Dot Product | 1 1 | |
,: |
Enlist | 99 | Membership | 99 99 | 1 = 'a' ,: 'hola' |
; |
Mold | 1 | Laminate | 99 99 | |
;: |
Squish | 99 | Group | 99 1 | 0s denote new group |
# |
Tally | 99 | Replicate | 99 1 | |
#. |
Decode Binary | 0 | Decode | 0 1 | |
#: |
Encode Binary | 0 | Encode | 1 0 | |
{ |
Increment | 0 | Take | 99 99 | |
{: |
Head | 99 | Composite | 2 1 | |
{. |
Catalogue | 1 | Union | 1 1 | |
} |
Decrement | 0 | Drop | 99 99 | |
}: |
Tail | 99 | Count | 99 99 | |
`. |
Format | 0 | Format | 0 99 | |
B: |
Encode Binary+ | 0 | Encode+ | 1 0 | |
E. |
N/A | N/A | Match | 99 99 | |
I. |
0-range | 0 | Wrapping Index | 99 99 | |
i. |
Unindices | 1 | CTX Unindices | 99 1 | (d) case takes orig shape of data on left |
i: |
Identity | 0 | Index Of | 99 99 | By items |
K. |
Keys | 99 | Group+ | 99 1 | m: ⊢∘⊂⌸ , d: #$.&? |
v. |
Nth Prime | 0 | Or | 0 0 | |
v: |
Floor | 0 | Min | 0 0 | Str(m): lowercase |
Monadic B:
is equivalent to :;(-`"&:(^:/)#")&.((],`0#[)")#:
when >r0 data is passed.
Dyadic B:
is equivalent to #:=
when >r0 data is passed on the right.
Binder | Usage | Monadic | Rank | Dyadic | Rank | Notes |
---|---|---|---|---|---|---|
" |
u" |
Each | 0 | Each | 0 0 | |
". |
u".v |
Repeat | 99 | Repeat | 99 99 | |
": |
u": |
Tie | 99 | Tie | 99 99 | |
& |
u&v |
Compose | N/A | Atop | N/A | Binds if immediate |
&. |
u&.v |
Before | N/A | Before | N/A | Binds if immediate |
&: |
u&:v |
Hook | N/A | Hook | N/A | Binds if immediate |
` |
u` |
Commute | N/A | Flip | N/A | u&`v is v&u |
/ |
u/ |
Reduce | 1 | N-wise Reduce | 0 1 | |
/: |
u/: |
Diagonals | 2 | Each left | 99 99 | |
/. |
u/. |
Reduce First | 99 | Sort Up | 99 99 | |
\ |
u\ |
Scan | 1 | Table | 1 1 | |
\: |
u\: |
Antidiagonals | 2 | Each right | 99 99 | |
\. |
u\. |
Suffixes | 1 | Sort Down | 99 99 | |
@ |
u@v |
Compose | N/A | Over | N/A | Rank if right arg is immediate |
@: |
u@: |
Zip Self | N/A | Zip | 99 99 | Allows uneven args |
@. |
[email protected] |
At | 99 | At | 99 99 | Depth if right arg is immediate |
}. |
u}. |
Runs | 99 | Amend | TODO | |
;. |
u;.y |
Cut | 99 | N/A | N/A | |
$: |
u$: |
Fixpoint | 99 | Repeat(n) | 0 99 | d: takes left arg, not operand |
$. |
u$. |
Filter | 99 | Filter | 99 99 | d: pass left arg to each check |
put A -> print A
A put B -> print B A times
jn A -> join vector of strings A on spaces
A jn B -> join vector of strings B with separator A
sp A -> split vector A on spaces
A sp B -> split vector B on character A
su A -> >. A
A su B -> B~>:A
sd A -> <. A
A sd B -> B~<:A
I -> the input
V. -> all vowels, capitalized
A. -> all letters, capitalized
C. -> all consonants, capitalized