3 ms·
I thought I knew python, but then I saw this: ?> sum::{+/x} :" sum + over / the array x :monad ?> sum([1 2 3]) 6 ?> count::{#x} :monad
by MPSimmons 2y ago
I thought I knew python, but then I saw this:
?> sum::{+/x} :" sum + over / the array x
:monad
?> sum([1 2 3])
6
?> count::{#x}
:monad
?> count([1 2 3])
3
What?
- deleted 2y ago[deleted]
- asloan23 2y agoSorry if this is a dumb question, why is this weird in Python? I use R as my main language and this is exactly how I would expect it to work. Does Python not do this naturally?
- faizshah 2y ago> sum::{+/x} > 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.__add__ 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.
- asloan23 2y agoOh I think I see what you mean. Yes I was thinking of the built-in functions of sum & length
- jofer 2y agoKlong is a different language than Python. Python using numpy would look broadly similar for the first few examples, yes. However, this is a way of executing a different language on numpy arrays. Array languages are a different paradigm. Klong is an array language, while Python + numpy allows some array paradigms, but isn't an array language. 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.
- MPSimmons 2y agooooooooh I think I'm starting to see... 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
- gshulegaard 2y agoI just briefly reviewed the README docs, I believe the KlongPy is a custom language which transpiles to Python. The REPL block you are trying to interpret is the KlongPy REPL not a Python one. 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')".
- itishappy 2y agoI'm new too, so take my opinion with a grain of salt, but I think you're right with one minor correction: 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)
- MPSimmons 2y agoMan, that's so weird. Thanks for the clarification.
- nils-m-holm 2y agoThe langiage in the examples is Klong, not Python. KlongPy translates Klong to Python and then executes it.