Okay, I've been thinking about the named/unnamed args distinction, and I'm sorta confusing myself as to what their purpose should be. ...that's probably not particularly clear.
I was kinda thinking that too, like the use of [] or () is more of a semantic use than a real functional difference. It would make sense to allow default values for parameters in (), right?
I'm also thinking that you should be able to mix named args and unnamed ones, with the result that the unnamed args are assigned to the first parameters available.
Like, if I have func:foo[a=1, b=2, c=3]{\print(a,b,c)}, then I do foo[c=7, 5](), I should get 5 2 7.
Shouldn't be too hard though. All I need to look for is a = or a : (with func, op, type in front) to make the symbol table, and keep track of where I saw each of these.
I'm actually gonna do the third stage next. I want to make it so that AST nodes don't handle their own execution, but that the object nodes tell the executor what to do.
If you're printing out the values of integer variables, you might be doing something like x = 5; \print("x: "+x), and it's a pain to have to convert x to a string every single time, like I encounter in Python.
Could do that since it's not reserved for anything. Though, if we're okay with the potential confusion of ||, we should probably be okay with the potential confusion of ++.
I do plan on really emphasizing in the Pytek tutorial that a lot of traditions/conventions have been/are being broken, so we could just do ++ for concatenation anyway.
And, y'know, I haven't really implemented much of anything beyond working on the parser. I'm probably gonna make concatenation ++ (it won't be an increment operator), so I could probably do +* for repetition and make + and * vectorize by default.