@dzaima They're are actually two tied for top votes. But the one at the top the way you filtered, simply said consistent results. Anything appended to an empty program will behave consistently, in any well-behaved language. So I suppose that means it's up to the discretion of the voter?
@dzaima They're are actually two tied for top votes. But the one at the top the way you filtered, simply said consistent results. Anything appended to an empty program will behave consistently, in any well-behaved language. So I suppose that means it's up to the discretion of the voter?
@dzaima By the language's definition, sure. But there's no visible difference to the outside observer. And one could make an APL, for instance, implementation that behaved identically, except it happened to also treat empty programs/whitespace as function
@AviF.S. by that definition - would be a valid function in Python, which it's definitely not
@AviF.S. neither is required for being able to reuse code, but a function necessarily needs to be storable for reuse, otherwise it's not a function but a code snippet
@dzaima Good point. I'm agreed that it's not by any sane measure. And it's actively un-helpful to think of it that way. But I still think that it counts as under-the-hood, and that the language could hypothetically be implemented either way. Which means that in the case of a competition like this, one could make a concrete case, given the goal in mind
@AviF.S. for example in in Jelly (and Canvas) each line is a separate function, callable by some means. Neither part is naming the function nor storing it anywhere, they just "are"
That hardly seems to hold because in all reasonable languages (ones with file reading), you can implement gotos by reading your own source code and counting lines?
@dzaima But then any and every code snippet is a function, because you can simply give the starting and ending location of it and then later on you can run through and find that code snippet...
@AviF.S. we haven't yet discussed the "what are valid ways of calling a function" part (i'd certainly say "read source, cut between X and Y, execute" is not a valid calling method)
Also, it seems messy because no one ever said anything about post processing... Any function could allow + or - to become a 'function' if they allowed post processing to do lambda a,b: a symbol b for dyadic funcs or lambda a: symbol a for monadic
@dzaima True! But at this point I'm losing site of the larger discussion, haha
"what are valid ways of calling a function" definitely needs to be a standard fact about each language afaict, otherwise i could say "Python, 0 bytes, call with print("Hello, World!")" for a hello world competition
@Wezl Haha, great prank when using esoteric languages no one knows!
@dzaima Haha, don't those meta posts make you die inside with jealousy!! Martin Ender, who totally does deserve the points, asked the question with ~100 votes = 1000 rep. But then answered in 14 different ways, each with a title and nothing else. Each of those has average ~85 votes. Meaning he earned ~10k from that one question, immediately proposing answers to himself!! Those meta posts just crack me up so much!
@dzaima Ah, understood. In other words, you're not downvoted because your post is bad quality, or not well though out, or not helpful, but rather because they disagree!
@dzaima True... but I started a draft of how to use APL Orchard. There's a section on formatting in the messages, so seems worth adding for completeness, no?
Community wiki is not a rep waiver
I've mentioned that from time to time in the past.
Community wiki doesn't just mean that you cannot earn rep from a post. Yes, it does have that side effect, but the community wiki option is for posts that can be edited by anyone without worrying about post ow...
@AviF.S. also, little tip - to view the source of any message, go to the transcript (again, middle click its arrow) and edit history is always viewable there
@dzaima Interesting, you can access history of removed messages directly from the removed message. But if you permalink from anywhere else, the (removed) doesn't even appear in the transcript...
@dzaima Thanks a bunch! I added 5 new things to page just now re: all this. Becoming a bit over-the-top, but always easier to cut than to add, I suppose!
@dzaima N days from now, will the removed message still be visible here, in non-transcript land?
@dzaima Ah, I got it backwards! Okay! Well thanks for all that! I feel like I should let you go rest now after like 3 pages of all sorts of bargering you!
Thanks a bunch, though, all super entertaining, helpful, and much long-term value extracted now on the wiki draft :)
@RGS the day Marshall joined this chatroom and sent a couple of messages it felt like everyone was already in sync with what was happening and everyone seemed so enthusiastic about it! And to me it just flew over my head
@RGS There are a lot of issues with current APLs. That may be fine for existing users, but for newcomers, there's really no reason they need to deal with the old warts. Marshall (and the rest of the internal group that was working on BQN before he left) is trying to take the best of APL and make a new language that doesn't suffer from forced backwards compatibility.
@RGS A lot of people have been complaining about issues with the language (or even tried making their own version because of such things), and yes, for Nathan, RichardPark, Nic, and me, it isn't news at all. We've been working on designing this language for a long time.
I have a vector of vectors that contain some indices, and a character vector which I want to use them on.
A←(1 2 3)(3 2 1)
B←'ABC'
I have tried:
B[A]
RANK ERROR
B[A]
∧
A⌷B
LENGTH ERROR
A⌷B
∧
and
A⌷B
LENGTH ERROR
A⌷¨B
∧
I would li...
@Bubbler I don't know the syntax (?) of the depth operator, but because we know B is a "string", wouldn't it suffice to have A(⌷⍥0 1)B or something of the sorts?
@RGS Ah, you need to rebuild your session. )load buildse then BUILD_SESSION'UK' then save your session. In a new install with the updated file, this isn't necessary. Actually, it should be enough to do ]box and then save your session.
yay! (note that i haven't installed the font, i just include it in as an external thing chromium for testing so didn't notice anything)
@dzaima (i extended the edges for the heavy boxchars so they blended together better, don't think i'll bother redoing the regular ones beyond │─ as my generator doesn't function well on non-heavy ones)
@Adám I'd absolutely no idea several within Dyalog had started on BQN... It's seemed, to me, entirely like Marshall's idea/property the whole time... From the Github to the way he talked about it during the meet.jitsi and in the room ⍨
Was it his idea, but then others were interested in helping to brainstorm the foundations, and then he took it back again, and is flying off with it, back in his 'field'?
@Adám Huh... Is it still a team thing? Because the latest GitHub repo seems to be his thing... And in the conversation, everyone addressed the questions to him about the design, as if he was deciding. And you and he went back and forth for the majority of him, under the guise of you questioning and him being the "one"
@Adám Ah, understood. So it's now in his hands, primarily? After the BQN2NGN was done together for much time?
@JeffZeitlin +←1 Same! Edit: Whoops, I misread. I thought you said to much time on one's hands-- that's me. Whoopsies
@Adám I think this is overstating it. We had three or four meetings about how we would go about making a "new" APL, and I wrote a document about what I later called BQN during that time, but we never did a comprehensive review of BQN.
@dzaima 1) Looks like you missed some homoglyphs: ⊝⊛ 2) I think the ⦅⦆ need more empty space in the middle. 3) Can you upgrade ∅? 4) Why does ◇ look all funky in certain sizes?
@Adám 1) updating; 2) while i agree, it's hard to do without curving it a lot; round parens are just not meant to be double-struck; 3) see 1; 4) no clue, i didn't touch it
@Adám maybe it's the hinting/instructing doing its job, but those instructions are wrong/old, imma clear that
@Adám and @ngn following up on our conversation from some days ago about writing really terse code, I had a go at it... Still don't know how I feel about it, I think what I linked looks too odd for Python code...
@Adám i personally find following control flow much harder in oneliners. I'm fine with linear oneliners in APL, but don't like pretty much everything else
also spaces are a really really really good code self-documentation and readability increasing tool, i have no clue why one would want to intentionally remove them everywhere possible (even worse, if you still have horizontal screen space)
adding a space after every ; there would help a lot imo - if i'm reading a line, it becomes 10x easier to skip reading a statement that i don't care about rather than having to search where the ; is
i might have to look into how to install ttf files on different platforms. I was noticing a lot of inconsistent rendering between my devices (android, osx, and debian linux).
@dzaima Try putting index.html in adjacent browser (I'm using FF) windows with the two fonts. The quickly switch back and forth between them. Many characters are quite bad in yours, only a couple are better (in the exact same way).
@cannadayr That might be obvious if you know the Greek alphabet, but it really prevents allowing Greek names, and also it is odd that the last letter is the argument when there's only one.
@dzaima TIL there was a "hinting" setting in mints font options, previously set to medium.. Full makes the taskbar finally not ugly, but unfortunately doesn't seem to affect chrome
Sure, that's the reason. The reason for w and x is that a single argument naturally is x as in f(x), and the w is immediately to the left of x in the alphabet. The left argument is usually the parameter for the function, while the right argument is the main argument.
÷ and - are historical oddities (and by extension, ⌹ and ~), while ! and | have been "fixed".
i personally dont think of dfns in APL in terms of x,y,z. Partially because TMN function calls use a more M-expression like syntax for function calls, partially because i already have x,y,z associated with variable declarations or axis.
⍺ ⍵ is helpful-ish to me at least (and this is likely due to using it for a period of time), because i start to visualize values kindve tracking inwards from different directions in the function calls
humans can be reprogrammed. this is just more a comment about things I began to appreciate about DFN based apl.
@Adám It looks to me like the characters in the old rendering are smeared vertically (see ∞ for example), and the reason that's better is that some characters are depending on it. If the horizontal lines could be fixed I think the new version would be an improvement.
@cannadayr My alternative scheme used one and two upper dots above to distinguish monadic and dyadic operators. (Compared to the current superscript/has-circle scheme.)
most of the chars i added/redid indeed don't have hinting/instructing, but e.g. ≡≢ do (i redid them completely) so i'm kind of surprised it looks so weird
@cannadayr I do think this is mostly a matter of familiarity. Not that ⍺ ⍵ don't have these advantages, but the fact you think that makes them better than 𝕨 𝕩 (which have other conceptual advantages) is because you're familiar with them. After less than a month of working with BQN I find them to be about equally usable.
@Marshall And my impression is that many younger people who might be interested in BQN find greek letters arcane and off-putting. There's also the fairly niche problem that they don't mix well with greek text.
@Marshall I am a young person interested in APL (hence potentially interested in BQN) and I like Greek letters but that might be because I am from mathematics, where we use Greek letters aplenty
@RGS That is because you are from mathematics and specifically college-level mathematics, I'd guess. You might see a theta in high school, but not alpha or omega.
@RichardPark I've also been thinking about this comment about pronouncing 𝕨 and 𝕩. Of course you (I) shouldn't use x and 𝕩 to mean different things, but is the fact homophones might come up really that much of a problem? Similarly, you might use GetURL and gitURL when just doing text program, but would avoid them if you want to speak about the code.
@Marshall Yeah I've also thought that - in JP there are homophones up the wazoo and you're generally fine just because particular words only make sense in context (although puns are also endless) - k uses x,y,z and I'm sure it's not a problem
@ngn The idea with w/x and not x/y is that the left/right arguments should be alphabetically ordered and if there's only one it should be called x.
@Adám There's no serious problem, but I prefer the marker than these identifiers are "special". In particular, you need to check for F or G to see if it's defining and operator, and the double-struck characters make that much easier. And you won't end up accidentally turning your function into an operator by using f as a variable.
I think it makes a lot of sense to leverage double struck and/or fancy characters if you are going for a symbol heavy APL-style approach already. I can't see many reasons for changing it outweighing how much simpler that piece of parsing is when argument variables are special cased characters.
especially with the added bonus of sort order that Marshall has incorporated
For contrast, in Rakue code blocks allow argument capture into local variables by use of the ` twigil. { sort $^a, $^b }
I'd really like to try a properly designed LPA (left-to-right APL) with postfix monadic functions. There, it'd be obvious to use x and y (double-struck or not).
This creates a code block with signature: -> $a, $b { sort $a, $b }. The choice to use alphabetical ordering for this kind of sugar turned out to be a really great decision. It DWIMs (does what I mean) in the vast majority of general cases
@Adám probably again familiarity, but I sortve find RTL apl appealing. I cant prove it or anything but I lean towards agreeing with the original assertion that RTL produces results that tend towards fewer parentheses than LTR.
Concerning the "magic" arguments to dfns - or even to any functions - I wouldn't object to them requiring a prefix glyph that wasn't otherwise used, e.g., $. With that as the signal, it also effectively removes the conflict with using names in another language. I note that it does break compatibility, but that might not necessarily be problematical...
It's also precisely why I'd been lazy in adding those particular ones at the beginning. Those were the only TODOs that I didn't actually do when I first posted it (in original draft). I didn't want to figure out how to do the images and format it nicely...
@JeffZeitlin One idea is to introduce a "header" to dfns. Shakti K has just begun requiring this universally. The ill-fated APL# had that too, though I think it was optional.
@JeffZeitlin I like to think of it as a unification. I actually sometimes appreciate the tradfn header, as it gives me a quick hint at how this thing is to be called, and if proper names are used, also what the arguments/operands are supposed to hold. A dop using only ⍺⍵⍺⍺⍵⍵ gives no hints as to the purpose of anything, and you have to go hunting in a large one, to see if it is a function or an operator.
@Adám - There is that. My inclination tends to be toward using dfns for "quickies" - not necessarily "one-liners", but not much more than that. Anything that needs to be complex is, IMO, where one should be using tradfns.
@Adám - But then, what's the point in having the dfns in the first place? They obviously were perceived as filling a gap somewhere that tradfns were seen as inappropriate for - so what do you really gain by unification?
@JeffZeitlin No, they were added because tradfns couldn't be patched up to allow a more functional style.
All the features of dfns could have been hacked into tradfns, except lexical scoping.
E.g. a separate symbol could be added to close a tradfn, e.g. ⍫ which would allow them to be nested. One could then allow them to be used inline too. And by allowing a diamond on line [0], they could become 1-liners as well.
If you sacrifice yourself to some additional parser complexity, you can have both explicit signatures always and locally scoped named argument containers. That's in fact the approach that Raku takes that I mentioned above. Larry always favors tormenting the implementer for the sake of the user, though. And if Perl's sigils are controversial...
You can imagine what adding a second order sigil called a 'twigil' into the mix caused.
GNU APL's approach to defns is a similar sort of "explode to tradfn format" operation
I know. I'm not implying that is the approach. I'm noting a similarity: parse sugar into the format you eventually want
If you are going to go for explicit argument lists, you don't also have to sacrifice the flexbility of specifying the argument lists inline and parsing them into the right syntax.
Keep in mind that proper closures imply blocks where passing an argument is a failure case
So you are going to want to create some sort of type signature out of the bare "defn" case anyway
@Adám @DyalogTeam: Just wanted to say what an incredibly elegant format you guys came up with for 1200I(⌶)! Wasn't honestly particularly excited for a bunch of date-time formatting/converting, but that's the sleakest, most self-documenting format I've seen! Definitely seems like other languages should be using it
I wanted to also raise to your attention that jupyter-lab is a generally more satisfying experience than the regular jupyter-notebook interface. At least it was the recommended interface in most of the Jupyter related articles I have read.
@ab5tract Yeah I had started something that's intended to be like a wiki-style collection of tutorials in Jupyter inteded for use with Lab github.com/rikedyp/LearnAPL but I'm currently working on something a bit more old-school just to get the content together first for a guided intro: rikedyp.github.io/APLWorkshop they're both very WIP right right now but you're always welcome to send feedback to rpark@ or here or on github or whatever
@ab5tract dockerfile being the one linked to from the download-zone.htm page?