?> sum::{+/x} :" sum + over / the array x
:monad
?> sum([1 2 3])
6
?> count::{#x}
:monad
?> count([1 2 3])
3
What? ?> sum::{+/x} :" sum + over / the array x
:monad
?> sum([1 2 3])
6
?> count::{#x}
:monad
?> count([1 2 3])
3
What?> count::{#x}
These two expressions are not valid in R or Python. They are implicitly declaring a function without declaring the arguments, it is implicitly iterating over the array and returning the result (all features of array languages to make it more concise).
Python’s + and / are a function of two objects (dyadic) and are syntactic sugar (they can’t be treated as function values, thats what the operator module is for): https://docs.python.org/3/reference/datamodel.html#object.__...
The array languages optimize for concise code so a lot of things are done implicitly that are done explicitly in Python.
The python equivalent:
> _sum = lambda x : functools.reduce(operator.add, x)
> _count = lambda x: functools.reduce(lambda acc, _: acc + 1, x, 0)
Of course in python and R there are built ins for these already (sum(x) and len(x)) but this is just to show what array languages are doing for you.
Notice how they're _defining_ the "sum" operation there. Instead of being something builtin, they defined "sum" as {+/x}.
{+/x} is the interesting part. That's Klong. It's not being able to define a "sum" operation, it's that "sum" can be expressed as {+/x}. That's very different than both R and python.
sum::{} is the creation of a monadic function (which I just learned about because I don't have a CS background)
:" is a comment
sum([...]) is calling the function with a list, and the function will iterate over the list adding each of the elements
count::{#x} is another monadic function that returns the number of elements, which then gets called
Embedding KlongPy in a Python block would look more like this (also from the docs):
from klongpy import KlongInterpreter
import numpy as np
data = np.array([1, 2, 3, 4, 5])
klong = KlongInterpreter()
# make the data NumPy array available to KlongPy code by passing it into the interpreter
# we are creating a symbol in KlongPy called 'data' and assigning the external NumPy array value
klong['data'] = data
# define the average function in KlongPY
klong('avg::{(+/x)%#x}')
# call the average function with the external data and return the result.
r = klong('avg(data)')
print(r) # expected value: 3
Note the calls to "klong('<some-str-of-klong-syntax')". name::{body} :" function declaration
This isn't necessarily niladic or monadic or dyadic on it's own, it depends on the body. The bodies from the example all just happened to be monadic. +/x :" monadic : sum over argument x
#x :" monadic : count of the argument x
+ :" dyadic : sum
!10 :" niladic : an array from 0 to 9
I had to look up how calling a dyadic function looks in Klong: add::{+}
add(2;3)