Apple Array System
Some cases are not implemented. This is provided as an artefact.
See Apple by Example for a demonstration of capabilities.
The compiler will bail out with arcane error messages rather than
produce an incorrect result, except that the Python/R extension modules do not
enforce type safety and thus may mysteriously segfault or produce unpredictable corrupt results.
Spilling (during register allocation) is not implemented for Arm. Also
floating-point registers aren't spilled on x86.
Compiler-As-a-Library
Rather than an environment-based interpreter or a compiler invoked on the
command line and generating object files, one calls a library function which
returns assembly or machine code from a source string.
Thus the same implementation can be used interpreted, compiled, or called from
another language.
 > [((+)/x)%ℝ(:x)]\`7 (frange 1 10 10)
Arr (4) [4.0, 5.0, 6.0, 7.0]
>>> import apple
>>> import numpy as np
>>> sliding_mean=apple.jit('([((+)/x)%(ℝ(:x))]\`7)')
>>> apple.f(sliding_mean,np.arange(0,10,dtype=np.float64))
array([3., 4., 5., 6.])
> source("R/apple.R")
> sliding_mean<-jit("([((+)/x)%ℝ(:x)]\\`7)")
> run(sliding_mean,seq(0,10,1.0))
[1] 3 4 5 6 7
The JIT'ed moving average in Apple happens to be faster than the rolling mean from
the zoo package.
Dimension As a Functor
This is based on J (and APL?). Looping is replaced by functoriality (rerank).
To supply a zero-cells (scalars) as the first argument to ⊲ (cons) and 1-cells as the second:
(⊲)`{0,1}
We can further specify that the cells should be selected along some axis, e.g.
to get vector-matrix multiplication:
λA.λx.
{
  dot ⇐ [(+)/((*)`x y)];
  (dot x)`{1∘[2]} (A::Arr (i`Cons`j`Cons`Nil) float)
}
The 2 means "iterate over the second axis" i.e. columns.
Installation
Use ghcup to install cabal and GHC. Then:
make install
to install arepl (the REPL).
Run
make
sudo make install-lib
To install the shared library.
Python
To install the Python module:
make install-py
R
Install libappler.so on your system like so:
make -C Rc
sudo make install-r
Then:
source("R/apple.R")
to access the functions.
Documentation
Type \l in the REPL to show the reference card:
 > \l
Λ             scan                     √             sqrt
⋉             max                      ⋊             min
⍳             integer range            ⌊             floor
ℯ             exp                      ⨳ {m,n}       convolve
\~            successive application   \`n           dyadic infix
_.            log                      'n            map
`             zip                      `{i,j∘[k,l]}  rank
𝒻             range (real)             𝜋             pi
_             negate                   :             size
𝓉             dimension                }.?           last
->n           select                   **            power
gen.          generate                 𝓕             fibonacci
re:           repeat                   }.            typesafe last
⊲             cons                     ⊳             snoc
^:            iterate                  %.            matmul
⊗             outer product            |:            transpose
{.?           head                     {.            typesafe head
}.?           last                     }:            typesafe init
⟨z,w⟩         array literal            ?p,.e1,.e2    conditional
...
Enter :help in REPL:
 > :help
:help, :h                    Show this help
:ty            <expression>  Display the type of an expression
...