Works well with 0 parameters and currying, read almost like a haskell function definition.
f = () => ((b) => b) g = (a) => (b) => b+a h = (a) => (b) => (b, a) i = (a,b) => a print(f()(2)) print(g(1)(2)) print(h(1)(2)) print(i(1, 2)) On Sat, 13 Feb 2021 at 06:35, Paul Sokolovsky <[email protected]> wrote: > > Hello, > > On Fri, 12 Feb 2021 18:26:53 +1100 > Chris Angelico <[email protected]> wrote: > > > On Fri, Feb 12, 2021 Paul Sokolovsky <[email protected]> wrote: > > > ... And on the 2nd thought, that won't work. The reason it works in > > > JS is that it doesn't have tuples. In Python, "(a, b) => (1, 2)" > > > means "compare a tuple for greater-or-equal". > > > > Should be safe actually - "=>" is not a valid comparison operator. > > To punish myself for making such stupid mistakes, I volunteered to > implement PoC of that. And by long honorable tradition, improvements to > Python get implemented in Python first. So with my "imphook" thingy > https://pypi.org/project/imphook/, and with the hook module at the end, > following works as expected: > > =========== > $ cat example_arrow_func.py > f = (a, b) => a + b > print(f(1, 2)) > > res = ((a, b) => a + b)(3, 4) > print(res) > > print(list(map((x) => x * 2, [1, 2, 3, 4]))) > > # Confirm there's no crashing on bare tuple at the tail of file. > (1, 2) > > $ python3 -m imphook -i mod_arrow_func -m example_arrow_func > 3 > 7 > [2, 4, 6, 8] > =========== > > The implementation was written a bit cowboyishly in 15 mins, maybe, > just maybe, you can still crash it. (For example, it clearly doesn't > support newlines in arrow param list): > > ===== mod_arrow_func.py ====== > import sys > import tokenize > > import imphook > > > class TokBuf: > > def __init__(self): > self.tokens = [] > > def append(self, t): > self.tokens.append(t) > > def clear(self): > self.tokens.clear() > > def empty(self): > return not self.tokens > > def spool(self): > yield from self.tokens > self.clear() > > > def xform(token_stream): > tokbuf = TokBuf() > > for t in token_stream: > > if t[1] == "(": > # We're interested only in the deepest parens. > if not tokbuf.empty(): > yield from tokbuf.spool() > tokbuf.append(t) > elif t[1] == ")": > nt1 = next(token_stream) > nt2 = next(token_stream) > if nt1[1] == "=" and nt2[1] == ">": > yield (tokenize.NAME, "lambda") > yield from tokbuf.tokens[1:] > tokbuf.clear() > yield (tokenize.OP, ":") > else: > yield from tokbuf.tokens > tokbuf.clear() > yield t > yield nt1 > yield nt2 > elif not tokbuf.empty(): > tokbuf.append(t) > else: > yield t > > > def hook(modname, filename): > with open(filename, "rb") as f: > # Fairly speaking, tokenizing just to convert back to string form > # isn't too efficient, but CPython doesn't offer us a way to parse > # token stream so far, so we have no choice. > source = tokenize.untokenize(xform(tokenize.tokenize(f.readline))) > mod = type(imphook)(modname) > exec(source, vars(mod)) > return mod > > > imphook.add_import_hook(hook, (".py",)) > =========== > > -- > Best regards, > Paul mailto:[email protected] > _______________________________________________ > Python-ideas mailing list -- [email protected] > To unsubscribe send an email to [email protected] > https://mail.python.org/mailman3/lists/python-ideas.python.org/ > Message archived at > https://mail.python.org/archives/list/[email protected]/message/VOVHZUNJKCVCIPPMA4EBUJ2CQ5FJJR2F/ > Code of Conduct: http://python.org/psf/codeofconduct/ _______________________________________________ Python-ideas mailing list -- [email protected] To unsubscribe send an email to [email protected] https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/[email protected]/message/XXMRLNDJNQOEN53TBQYU5WRD3CAYPLOM/ Code of Conduct: http://python.org/psf/codeofconduct/
