@RGS Haha, thanks. I tried. The 'pra você' was unnecessary, I know, but I stole the first line from the song...
Super interesting, though! Thanks to doing that bit of research, I found out that Portuguese doesn't use inverted punctuation at the start of a sentence, like Spanish. So thanks for providing me that educational rabbit hole!
I can only imagine that it must drive you guys crazy that people are constantly thinking that because they know Spain/Spanish, they must know you... or well enough, anyway... because "how different can they really be?!" :p
But Portuguese people do have the tendency to be able to understand Spanish, although Spanish people cannot understand Portuguese... (also, I think @Adám won't appreciate us going off-topic :/ but we can talk about this in an appropriate place :) )
@dzaima Wondering if I should remove pattern matching from operator headers, and just force them to have a single header. Operator headers are pretty complicated and if you want pattern matching you can do it inside the returned function with a second pair of braces.
@dzaima The grammar as written doesn't allow extra parens except around the arguments.
@dzaima But that's actually easier to write with nested braces, since you don't have to repeat the operands: {F _π£_ G x:monadic ; w F _π£_ G x:dyadic} versus {F _π£_ G:{πx:monadic ; wπx:dyadic}}.
also why the switch to π£ for recursive operators? imo it'd make more sense for π to always be recursive self, and π£ added for derived operators
@dzaima All those are right. F_π£_G is an invalid token since it contains π£ but isn't one of the three allowed forms. I'm thinking I should switch to paired symbols like «π£» to avoid this sort of awkwardness.
@dzaima It seems cleaner to have π always have the same data type (function). I think there was some reason why the system you're describing, which I originally said I would use, worked really poorly in some situation, but I can't remember it now.
@dzaima Those are instances of FuncHead with the function omitted. The header for a value block has to be a simple label since there are no inputs to match. The only purpose of the label is so you can jump out with ←.
I was thinking that the expressions in the header should be evaluated when the function is created, which allows you to write whatever code you want there.
Although the fact that it's inside braces but is evaluated in the outer scope is confusing.
@dzaima Yes. Also you could have something awful like {F _π£_ G x:F x ; F _π£_ G:FβG}. If I allow multiple operator headers you would check every header/body to see whether the operator as a whole requires arguments. But this is really messy, which is why I was thinking to not allow multiple headers for operators.
this may not be a viable strategy.. https://dzaima.github.io/paste/#0tZLBTsJAEIbvPsVvD7QNpohHmt6UxEPlIC8wwC40trvYbi0ovoB3j76jj@CUphRMJUHjpZnOfrP7z/wTSTjZM4IAfRcvZ8BYPwgFQgCTeXNhnEvX53TEnFkvRUnaZDOLXg/9Abrj0fUIcsAMoCsEtrR9yPonsf3taZQkYhaRKZOS4kxU6e1HhsE8DIowUHkcV/lVyBxVcSZiyX/14SsElx@KkrWo4TEt1KLFpHmrlNW@mvKtc4cQqcyQmgotcUeJ4HG5Lswi1QWUKHC/VoZWN2mqU4e6FpQ2oDjWhZiBsqqPSEHmamoirbAQNBOpdQFyDzp1nPp2PvEUx3t9tz9n3aoniqNZc2cV8MV786rMvvrZbEwXlIJMOXyvHJu/AycN2K/BSQlOdmD7ngx5U3ZTJHMesCnYbLiYw5I6uaP/2bZJ43Wr08fdQTPlg@rRkkl0Oly2DbdFeumJx5x1Odbnx/ub5brflxzHzCZ08Yvt@vsOnVr3BQ#Java
@dzaima I think it's workable if you say any multi-body operator takes arguments. I still think the syntax is worse though. I would always prefer {F _π£_ G:{πx:monadic ; wπx:dyadic}} to {π½_π£_πΎx:monadic ; wπ½_π£_πΎx:dyadic}. It's much clearer about where π comes from too.
@AviF.S. it's my own code, but due to the condition for the throw being wrong, though it wasn't able to tell me it's wrong, IDEA was able to conclude that ce==true
@RGS i don't think "trivial" describes what's happening (the body is evaluated at deriving time rather than call time is the difference, nothing like it in APL)