« first day (1449 days earlier)      last day (1502 days later) » 
00:00 - 13:0013:00 - 00:00

00:18
Dang, during writing explanations of how it works I found a bug in the approach that didn't get exposed in all the test cases :(
Comments are good.
@Bubbler test case: LR=2, Pile=¯2 ¯2 2 ¯2. Expected: leftovers ¯2 ¯2, pairs: 2 - am I correct?
My code gives leftovers ¯2 ¯2 and empty pairs...
I'll comment that to the problem description. But then it's back to the drawing board for at least one of the four subexpressions for me.
I think I might have managed to salvage it, and only add one character to the most-golfed solution. Running test cases now...
00:48
0
A: Help me pair my left and right socks!

Martin JaniczekAPL (Dyalog Unicode), 62 bytes (SBCS) ,⌿⎕{⍺∊⍺⍺:((∊|⍴¨⍺××)n)(⍺/⍨0⌈2÷⍨≢⍵↓⍨n←⍺÷⍨+/⍵)⋄/∘⍺¨⌽0 2⊤≢⍵}⌸⍨∘|⍨⎕ Try it online! The initial "straightforward" version was around 76 bytes long; folks at The APL Orchard helped me golf it substantially to the snippet above. Thanks! How does it work? Explanatio...

@MartinJaniczek Lucid explanation!
Honestly the explanations for the subproblems feel "wrong" (I'm taking the APL code right-to-left and almost mechanically translating to English!), but at least showing the table that comes out of the Key operator is helpful, I think.
Pretty much what I do too.
Why are the golfing languages faring so much better on this one? Are we missing something?
It's possible the approach is different from them. I saw Key and ran with it. I didn't read the other golf-language solutions. Gonna take a peek now.
Folks are grouping multiple times, I'm grouping just once at beginning.
Sorting values and taking 2-fold reduce was something I toyed with but didn't get anywhere. Looks like it would be viable after all.
I've had great fun with this, and learned a few things by seeing you folks golfing. And to think I wanted to try the padding optimization on the query engine :)) Welp, maybe tomorrow. I have it sketched out on paper (much less code than I anticipated), now just to try it out on real data!
01:12
The line between work and fun tends to blur when it comes to APL.
01:29
I will have to figure out whether this changes the calculation results and whether I'll have to use dp,rp to fix them
dzaima/APL doesn't allow "over-taking"
yup I talked with dzaima about it here today
I think over-taking is one of the niftiest ideas. I use that all the time. E.g. to generate a length-X Boolean vector beginning with Y 1s: X↑Y⍴1
It surprised me first (not what I'm used to from FP languages) but it's really handy, yeah!
before I sketched this out I was like "man, I'll have to (padding rho 0),original data" but nope!
But I also don't hold lack of overtaking against the other languages. APL is overspecialized to numbers and characters. Would be hard to conjure default values for "type Card = Heart | Club | Diamond | Spade" (bad example but I'm too tired to type something more convincing) in an useful manner for the tasks done in those languages
01:57
Right, and occasionally APL's insisting on a prototype is a hindrance.
02:11
@MartinJaniczek FWIW, nested APLs can simulate a simple ADT (like a syntax tree) with no problem, though you don't get type checking and such.
The closest example I can remember, though it doesn't work on a syntax tree per se
Oh, I understood it wrong... Yeah, a prototype is not always a good thing to have
But when it is, it rocks.
True
∊∧.∧∊⍨ ― the permutation fish (?)
02:26
For a prototype and an ADT, I guess one could define a custom default value when it makes sense. When it doesn't, it's nonsense to write a program that requires one anyway
Most common annoyance is processing a collection of stuff with {}¨list failing when list is empty.
Hmm yeah, that's a mess
@user1261455 Hi TREND ING. If you want to participate here, email me: adam@ with the domain of www.dalog.com
I usually end up defining ForEvery←{×≢⍵:⍺⍺¨⍵⋄⍵}
But of course, the structure of the result may be bad.
02:42
Maybe there must be a way to discard prototypes or use a custom prototype
so that if one does need a prototype, they can explicitly feed it
J has the Fit operator for that.
Yeah, I was thinking of it too
But it is a very odd operator. You can't define a model for it.
Much like bracket axis, it does something unique for every primitive, and doesn't work on user-defined functions.
Kind of, though I don't see any immediate problem with "doesn't work on user-defined functions"
Until you want a variation over a primitive…
CMC: Collect lines of input text () until a blank line is entered, then return that as a vector of character vectors, without the trailing empty vector.
03:23
¯1↓b⊣{b,∘⊂←⍞}⍣{0=≢⍺}b←⍬
@Razetime It's 19, and use a←⊂⍞ to go 18
and swap two conditions to go 17
oh, nice
 
3 hours later…
06:55
@Adám Thanks Adám for the suggestion. I found relevant past posts on that forum.
 
1 hour later…
07:57
@MartinJaniczek Overtake (or other operations requiring fill) on an array of class instances will call the niladic constructor, if the class has one.
I've added a page about the IBM 5100 to the APL wiki: aplwiki.com/wiki/APL_5100
@RomillyCocking Thank you. Now, if you compare to a similar article you'll see some differences in both style and content. Do you want to polish this new article or should I?
08:15
@Adám Will you change the 2020 here to 2021?
Yes, in two weeks or so.
08:49
@Adám That's true, in as far as it applies, but it's based on a false premise. APL did become widespread, for a while. Of the 100 largest UK companies, in 1986 well over 30% used APL for mission-critical applications, and Gilman & Rose's 'APL an interactive approach' had sold over 100,000 copies.
In the 1980s there were lots of things that businesses needed to do that nothing else could do as well.
In the 2020s there are also lots of things that businesses need to do that nothing else can do as well.
@Adám Tell me some. I can think of a few but they are very specific.
Mainly when it comes to exploring algorithms and fast computation of problems that are well expressed with (especially) Boolean arrays.
@RomillyCocking @Adám there's also a web-emulator of the 5100 somewhere, anyone knows?
However, it is true that a lot of APL's core advantage has been conquered by domain-specific libraries and off-the-shelf tools.
@ktye It is linked from the APL/360 article.
08:55
yes that's it.
@Adám I'm happy to do polish the 5100 article, but not today.
@Adám I think there's potentially a huge advantage for those in AI working on the frontiers of RL and ANNs. Almost all published papers describe their Algorithms in math notation. They may or may not provide implementations. If they do they are typically in TensorFlow, PyTorch, R or matlab. An APL implementation would be as readable as the math and yet be executable.
@ngn wait, wot? That's a cool trick.
but on the other hand, those things are so easy to install and instantly use without necessarily actually understanding or doing any real maths
⋄ 3{0 ⍺⊤⍵}19 ⍝ nice
@xpqz
┌→──┐
│6 1│
└~──┘
09:08
@rak1507 True, but serious researchers need to understand and be understood.
@rak1507 Yeah, we definitely need to improve the experience of installing both APL itself, and libraries/packages. And we really need to look at keyboarding too.
@RomillyCocking Yeah true
@Adám TryAPL goes a long way towards that goal. The thing it lacks (from my POV) is the ability for the user to attach their external storage - Dropbox, Google Drive or AWS storage for example. Several great web-based apps do that well,and it would permit the saving of wssws and the use of external apl source files.
The ability to load notebooks is a big step in that direction but I have not yet found a way to make notebooks persist in a session. (That would also solve the problem)
I feel like tryapl does what it is meant to (introduce beginners to APL) well, and there's not much need to give it loads of extra functionality. Docker containers + rentable servers sound like a better idea to me
@RomillyCocking saving of "wssws"?
09:15
wsses
@RomillyCocking there is an undocumented (afaik) way to go to a notebook directly: tryapl.org/?notebook=https://github.com/rikedyp/…
@RomillyCocking We also have the "trypl workspaces" in the "File" tab, but have not yet implemented a ?ws=URL which would allow you to pre-populate a tryapl link with data
@RikedyP That should be trivial, though.
@Adám Except we haven't properly done multiple ?this&that queries this time around so not completely trivial if you also want to execute code on load
There's this I had set up a while ago, which is basically a Docker image containing Dyalog APL and Jupyter
and you can use it for your own code in Gitpod
@rak1507 If you want beginners to learn enough APL to be useful I think you need to show the language solving real but simple problems, and to make it easy for them to start doing that on their own.
09:20
@RikedyP Just check for ws= first, and then execute any code after.
@Adám and @RikedyP I think Gitte is going to set up a meeting where we can discuss this and related topics.
@Adám well yeah I'm just saying I'm not doing it today
:-)
@RikedyP lol. Good for you :)
@Adám Actually I'm looking into pinging myself (maybe on zoom) if tryapl goes down
@RomillyCocking was trying to be diplomatic but adam pushed me
09:23
@RikedyP As was I - not too annoyingly, I hope.
@RomillyCocking considering one of the inspirations was tryhaskell.org, it has amazed me going back there recently to see how little you can actually do on tryhaskell.org
@RomillyCocking not at all - it is my dream to have a URL you can go to to get a fully functioning RIDE in no time / no installation, but alas
Yup. When I re-tried TryAPL a week or so ago I was staggered at the improvements you've made. I think it's a game-changer.
well there is @Bubbler's thing, just takes a while to boot
@RomillyCocking FYI notebook support had been in tryapl a while, I think the new interface goes someway to making things easier to use
This one doesn't have Jupyter, but does have RIDE and Acre (and RIDE fires up automatically if you open it in Gitpod)
<strong opinion warning>The vital thing is to reduce or eliminate friction for beginners and then ease the path to installing APL and using RIDE</strong opinion warning>
09:26
@RomillyCocking (I love how that's actually valid HTML)
@RikedyP I hadn't looked at TryAPL for ages.
@Adám We aims to please.
@RomillyCocking and also thank you for le complements
@Bubbler it's just the time to boot as I said - can't really be helped without being a very expensive app
@RomillyCocking word on the street is that there are users who use it for over 40 minutes at a time as their main APL environment!
Morten wants to have some of these images already up and running, so that when you connect, you get one right away, and then we spin new ones up as the pool diminishes.
@RikedyP Wow! That pleases me, though I'd love it if they migrated to somewhere where they could more easily flaunt/share their code.
@RomillyCocking word on the street is that they have a relatively popular youtube channel
09:31
@RikedyP Link, please!
@Adám That might work, but maybe it depends on the number of instances you want to support at once?
@Bubbler Wow that's awesome. It would be even more awesome if multiple clients could connect to one Dyalog process and pair on a workspace that way
Sounds like something hackable on top of existing solutions, hmmm... some kind of websocket broadcast tool
@MartinJaniczek ie. if I shared my gitpod URL with colleagues and everybody saw the same session log updating in realtime
Gitpod allows sharing snapshots but doesn't support sharing a live instance afaik
but that would be definitely awesome :D
09:40
@Bubbler Amazing and excellent work. May I add a link/explanation as an appendix to the MENACE book?
@MartinJaniczek I've thought about multiple people working on the same workspace, but it has many potential issues. I guess if only one person had write access, it could work…
@RomillyCocking My pleasure.
What you can do, however is have multiple people link their workspace to the same network drive, and they'll all see each others changes in real time.
@Adám Thanks for the tip; needs a network drive and the people to have Dyalog installed though.
@MartinJaniczek I think the RIDE link can be accessed in public though, so it might work if you share that link (instead of the Gitpod instance one) to others.
09:43
gitpod looks really cool I don't know why I haven't heard of it until now!
@rak1507 Yeah, it indeed is.
@Bubbler where can I find the RIDE link?
The most awesome part is that it's open source and free to use (with generous limitations)
@MartinJaniczek I'd expect that of anyone doing serious work in APL…
yeah, almost looks too good to be true
going to be using this a ton
09:44
@MartinJaniczek If you start a Gitpod instance, you'll see a link that opens the RIDE tab. Copy that page's address
@Adám My company is not there yet :) I wanted that live sharing for eg. a Google Meet call where I show off and explain some APL to the colleagues working on their implementations of the same thing I work on
But I'm guessing sharing my screen will work reasonably well
@MartinJaniczek Isn't screen-sharing enough for that?
@rak1507 I actually used Gitpod while working on Dyalog competition last year, and am still using it to upload various works to Github
@Bubbler That's what I was doing
@MartinJaniczek isn't that the gitpod instance link? I don't see the distinction yet (haven't had my morning coffee, might be that :D )
https://<UUID>.ws-eu03.gitpod.io/
@Bubbler I am mostly using my school laptop at the moment rather than my desktop pc, and I don't have any programming languages (other than dyalog) etc installed, so being able to still do stuff online sounds great
09:52
@MartinJaniczek Let me fire up my own...
The thing is, it only works the first time it's opened (at least when I tried it)
@MartinJaniczek The RIDE link has the port number (4502) before the UUID.
correct, I mistaked it for a part of the UUID.
it is there.
And there's one caveat: you need to go back to the Gitpod tab once in 30 minutes to not get it timed out
and I can confirm the second RIDE window doesn't work.
Maybe it's because the server doesn't handle more than one active connection?
10:07
Are any of the language implementors here familiar with IBM's IL? It was an APL-inspired Implementation Language that was used by IBM to implement a portable APL.

You can read the only paper I know of that describes it here:
https://pdfs.semanticscholar.org/e748/f7d4e64883d0a3ec518fc3b79c5b46fd81ed.pd
pdfs.semanticscholar.org/e748/… (your link is missing an f on the end)
@Bubbler The APL interpreter certainly doesn't know how to communicate with multiple RIDEs.
@rak1507 Thanks. I also just found this semanticscholar.org/paper/…
@Adám oh that's sort of disappointing. There should really be no issue to allowing it afaik - send all messages to all clients, and treat received messages from any all the same. The protocol is built in a way that that should always work afaik
@dzaima I've mentioned it before, but it was turned down as being not a realistic use case.
10:15
(hell, one could even make a separate multi-RIDE app that does that, which could seamlessly join a Dyalog interpreter with multiple RIDEs)
Ah, like a signal splitter. The interpreter would be non-the-wiser.
yep
Again, can you describe a scenario where this is useful?
Cursor movements, window positions, and typing are not sent to the interpreter, so it wouldn't be like screen sharing.
@MartinJaniczek ^
@Adám I don't think it's particularly useful, but it's still a fun side-effect of the protocol. I understand not complicating the interpreter with it
@Adám I would be content if people were allowed to enter their own expressions and everybody seeing both the expression and the result. No need to see them typing it.
And it's just what I expected to happen ("connect multiple clients to the same session"), not something I sorely need. As you said, screen sharing is a viable alternative.
10:21
Modern screen sharing tools allow taking control too.
Having a free-for-all would quickly become a mess. What happens if I'm editing a function and someone else closes the window with a different definition? What I was typing would be lost.
Never mind the editor. If I type an expression, but have not pressed Enter yet, and someone enters an expression, my session log would change, and my partial input would need to be lost.
It makes much more sense for multiple people to access a single synced workspace, but each with their own interpreter. And this already works.
(… I claim, having not actually tried it ― but theoretically, it should.)
@Adám as in, synced live? how would that even work?
@dzaima It'd sync whenever someone closes the editor (or saves from within it). Link monitors a shared drive and updates the workspace when it detects file changes, and it writes changes to disk, so…
@Adám the in-place editing is not suited for for this, indeed. (and it can already be seen by entering expressions from the terminal REPL)
@Adám but from one point of view, variables just randomly change. Not really suited for when you want to see what others are doing
> and my partial input would need to be lost
why? isn't your input line separate from the output?
@MartinJaniczek It isn't, at least in RIDE (as in the electron app)
10:34
That might be more of an issue of the RIDE client than the protocol.
@MartinJaniczek It is
@dzaima No, variables don't change automatically. Only code.
@Adám oh, so others wouldn't even see me doing a←1. That definitely doesn't work for live exploring
@Adám I guess the separator could only transfer info about open windows to the people who opened it, and not allow multiple opening the same one at the same time (or maybe only the first has write access?). Kinda sucks though, and makes the thing much more complicated than the simple idea of just copy-pasting messages
@dzaima No, you'd have to do ]add a to push your changes to everyone else. We are working on a workspace crawler that'd detect the change and auto-sync it if a has been registered as part of the source.
@dzaima (for reference, the current behavior is that the cursor just forcibly jumps to the end of the log when there are new things logged from outside RIDE, but otherwise it handled it just fine. That should be rather simple to fix if one wanted to)
10:38
Again, I think a fine-grained syncing would be more frustrating than useful. If you pair-program, then shared control (like provided by Zoom) makes more sense.
@dzaima It'd not match the interpreter's native behaviour though. Try executing 't'⎕WC'Timer'5000 1('Timer' '⍎⎕←⎕TS')
@Adám that only allows one person editing at one time. A RIDE protocol hack could allow for that too if you wanted to, with a bonus of less bandwidth & better quality/latency, and allowing doing separate things too
@Adam I've local-paired doing TDD in Java (ugh) extensively and remote-paired (in Python and APL) occasionally. Local pairing usually has the devs alternating use of the keyboard and mouse. (A writes a test, B makes it pass, B writes a test, A makes it pass). It can be quite a pleasant and productive experience.

Remote paring *can* work but IMO it always feels painful however it's done.
@dzaima I don't think two people doing things at the same time makes any sense, unless so disconnected that they might as well have their own sessions. RIDE as a form of screen share could work, but you'd anyway want at least voice comms, which I do think is beyond RIDE's scope.
@Adám oh, you don't even need to use the commandline interface to test that. (and that behavior still sucks)
@RomillyCocking Sure, I've done that too, and you can easily have two monitors, keyboards, and mice, if you want (though I've never seen that in practice ― sitting next to each other at a single mouse and keyboard seems to work fine). Anything remotely is more awkward, but surely the two devs need to see the same image.
10:49
The only person I've remote-paired with in APL was @MortenKromberg but I'm sure the developer was not the problem :)
@Adám it's also not consistent - sometimes the cursor jumps to the end of the log, sometimes it stays in the same place
@Adám When Morten and I did it I could see his screen and mine; we did commit-push-pull in Git to sync the code. I still remember the pain.
@dzaima Yeah, and that is a RIDE issue. The native Windows IDE is consistent (jumps to 6-space prompt at end ).
@Adám does it leave the content edited in the edited state?
(imo not touching the cursor would be the better thing to do)
@dzaima No it kills whatever has been written so far.
10:52
@Adám oh that's rude
The late sheep-and-cheese google group had quite a few experience reports from skilled devs doing remote pairing (though none in APL). I'll see if I can find any worth sharing here.
@dzaima Interestingly, {∇⌊⎕DL⍵⊣⎕←⎕TS}&5 politely waits until you're not in the middle of typing something.
@RomillyCocking OK, at least linking a network drive would allow you to forget the commit-push-pull task.
@Adám but without versioning
@RomillyCocking well, you could still have git, just not the need to commit constantly (and if you wanted to, you could probably bodge up a thing to create commit on any file change anyways)
That's true, but do you really want version tracking for every little change?
@dzaima Ah, good point. No need for a bodge. Link already has a feature that allows you to hook into whenever it changes a file, so you could simply put git commit there.
10:56
@Adám Well, yes, I do. That's what Smalltalk's ENVY/developer did. But it did it seamlessly, whenever any developer saved a change in the editor.
SALT can also track every little change without explicit action.
@RomillyCocking imo that's misuse of git. (I expect it doesn't ask you for a commit message on every save)
But not for a multi-dev team, which is what ENVY did.
@dzaima PyCharm reuses the last commit message by default.
@dzaima You could work on a branch, and then squash merge to master.
@RomillyCocking What? so you get identically looking commits?
@RomillyCocking so there's just a spam of 100s-1000s of commits while editing?
10:59
I'd think an auto-generated commit message like what GitHub does would make more sense.
@dzaima That's not the way one normally works. It was the way we worked when paring, and it sucked.
@dzaima well you could squash the commits down into a single commit after a certain amount of time
@rak1507 that's kind of obligatory at that point
@dzaima Ah, reminds me of the current TCR wave. Looots of small commits.
I'd rather have too many commits than too few
11:01
@MartinJaniczek (test && commit || revert)
I have had too many times where I break something and go 'ah damn, it was working 5 minutes ago, I should've committed!'
The way that ENVY worked was very different, and you'd need to use it for a while to experience how comfortable it felt. Everyone I know who used the original ENVY still feels it was the best ream development environment the've ever used.
@rak1507 Same, but when two file changes go together (say, moving a function from one file to another) I want them as a single commit.
But it only worked well for Smalltalk :(
@rak1507 depending on the editor, there might be better ways for local tiny change history. (IntelliJ has something of the sort, and google docs just straight up stores each character thange)
11:02
Sure, so you can do two commits, and then squash them into one @Adám
@dzaima right yeah
@dzaima PyCharm == InteliJ
@rak1507 Yes, but that can't be automated.
why not?
Because the computer doesn't know which commits belong together.
It is by PyCharm (pretty well, not perfectly)
At least, PyCharm does auto-merges when safe, and offers them when it's not sure
11:03
@Adám you can make it know by telling it :)
@Adám right, but what about squashing all commits made during one editing session or something? I'm sure that's possible
@dzaima Of course, but then there's no gain over doing so manually.
@rak1507 Define editing session.
@Adám as in the editor would tell that, not the user
@dzaima I don't get it.
@Adám some time between opening ride and closing ride? I don't know
11:05
@rak1507 That's way too long.
ok, then ]editing start and ]editing stop
or even ]editing stop commit "did a bunch of stuff"
@Adám name temporary ctrl+s commits e.g. [tmp]. Squash all [tmp]s when commiting.
@dzaima (but at that point, you're much better off by not using git and logging the changes separately)
Exactly.
I'm working on a project, going through issues. So I change a bunch of things to fix an issue. No the issue is fixed. At this point, I should commit (or squash, if I've had auto-micro-commit on).
I guess at that point, I could ]commit Fix #123 and that'd squash for me.
yeah
Still, as you say, this is not normal usage of Git.
Sometimes I wish the APL editor would persist the undo log to each item rather than to each window (i.e. it goes away when I close the editor window).
Of course, I just need to remember to Ctrl+S instead of Esc.
Maybe I should just disable Esc. In APL*PLUS, I used Ctrl+e to save-and-exit, and Ctrl+q to discard-and-quit…
11:15
@Adám still baffles me that RIDE doesn't bind ctrl+s by default
@dzaima Does it baffle you more or less than the fact that top people at Dyalog use Ctrl+s to type ?
@Adám do they not use ctrl+0 for ? cause RIDE has a default keybind using ctrl+0
@Adám which OSs do the top people at Dyalog use? Maybe that has a bearing on the issue.
@dzaima Good point. I guess this just shows that nobody really uses our stuff.
@RomillyCocking Windows.
\me weeps silently
11:20
@Adám and the ones that do that aren't from massive customers, stay quiet as nothing will change anyway
:-(
who's bright idea was it to use ctrl anyway :(
@MortenKromberg What happens if you from within RIDE hit Ctrl+0 ?
@Adám I was just starting a RIDE session to find out :D
Anecdote: being indoctrinated by RIDE's ` bindings, I even uninstalled the IME on my wife's Windows laptop as it was a bit invasive (might have been my bad settings of the keyboard layout settings, to not make it leak to other apps etc.)
11:23
@rak1507 Nobody seems to remember. IIRC, until version 12.0 we gave a choice at install time: ALtGr or Ctrl, with AltGr being the recommended option. Then, with the introduction of Dyalog Unicode, the IME was introduced, and the AltGr option was removed.
@MartinJaniczek I would personally suggest everyone to not use the default Dyalog keyboards on any OS :p
in a way, doing the right thing and then changing it to the totally wrong thing is worse than just doing the wrong thing all along!
@dzaima You would ― I do.
@Adám oh cmon :(
the existence of windows+space makes it (only just) bearable for me personally
11:26
@rak1507 do you actually use the ctrl+ layout? (or is that just talking about it being a default option)
yeah, I do
One important reason why "the top people at Dyalog" use Windows is that nearly all of our existing user base is on Windows. I agree that we need to do more to move faster in the direction of embracing new IDE's, but we need to be careful not to alienate the people who feed us.
So you've decided to install Dyalog APL? Great. You can download it from here and find out how to fix the keyboarding here.
3
@dzaima ctrl is easier to type than altgr or any alternatives
11:27
The reason for the choice of ctrl rather than alt is that alt is a Windows accelerator key, Alt+B might be a keyboard shortcut for a menu item or button. Therefore, back in 1990 or whenever it was, it was felt that ctrl conflicted less with the way Windows applications typically worked back then.
I'd have to go from typing ctrl with my left hand to altgr with my right hand and that is obviously far too much effort :P
@rak1507 right, obviously switching after a while is hard, but I don't think ctrl has much of an advantage if ignoring previous usage muscle memory
true, I should probably switch at some point
reloading a tab when trying to type ⍴ is a bit annoying
@MortenKromberg and now the linux version does the thing the ctrl decision was meant to not do - consume the special OS key
11:31
Today, alt seems less conflicted than ctrl. On of the reasons why I haven't been keen to change is that my current feeling is that all of Alt, Ctrl or even the Windows Key are "doomed". The walls are closing in and the OSes and editors will gradually consume them all. The prefix char is the solution.
@MortenKromberg AltGr, not Alt. AltGr is literally "alternate graphic".
AltGr is a key I use all the time to type characters on my keyboard, so it would be an awful choice for me.
I use AltGr to type @£${[]}\|µ€
@MortenKromberg prefix char is the best default solution, but providing optional options is still very good
@rak1507 Every colleague I've persuaded to try AltGr after years of them using Ctrl, very quickly became proponents and evangelists for that.
to type @?!
the only weird one in that is µ
all the rest are bog standard keys
11:32
Yes, on a Scandinavia keyboard, all of those are on AltGr.
oh, damn it
@rak1507 "standard" depends on the place of origin. ASCII literally has "american" in the name
Yes, AltGr has issues on non-English layouts, but not unsurmountable ones.
good point
I cannot deal with a prefix key, because I often type multiple APL symbols while holding the shifting key depressed.
11:34
for me, I need altgr for āēīķļč..., but i'm fine with switching the layout to APL, disallowing typing those but allowing APL chars
@dzaima Exactly, my main view about APL vs national lang.
@dzaima though i still have all of ascii without altgr on the latvian layout, so the transition doesn't change anything for it. I think the best (but also the hardest) option would be to have completely separate layouts per language
@rak1507 Oh yeah. Czech layout has @ as AltGr+V. Still ocassionaly useful (I switch between english and czech layouts often)
Interesting, I would've thought it was so common it would be one of the default ones in any language
@rak1507 alt+v and shift+2 are the same amount of key uses
11:37
@rak1507 @ only became common very recently, after all national layouts became standardised.
@dzaima good point
These are difficult issues and people have very different opinions. Making everyone happy seems almost impossible. We have agreed at Dyalog to have a meeting to rethink it all this spring, once version 18.1 is well under way.
My current thinking is
1) we should make it easier to choose the "APL key"
2) we should try to make prefix typing available everywhere as an alternative
Yes, I think simply giving people a choice is the best.
For many years, it was almost impossible to type {[]} on a Danish Mac. When I incredulously asked a Mac user about this, he said "yeah, programmers don't by Macs with a Danish keyboard, everyone knows that".
That's like how professional French writers cannot use French keyboards, because that layout doesn't allow writing correct Académie française French.
11:40
It may be a problem that the Dyalog CTO is too adaptable. I seem to be able to become productive on a keyboard with a different APL key or layout very quickly. I even managed to install our product "SQAPL" in Paris without swearing too much after the first 30 minutes.
(S Q A are all in unfamiliar places on a French keyboard)
@MortenKromberg Ha. Learning C on a Swedish keyboard back in the day was a pain...
Anyhow, this input is all useful, although the labelling of people as "top people at Dyalog" as if that explains something feels a bit unnecessary ;-). The development manager and several developers use Linux primarily, unfortunately our latest C developer selected Windows rather than macOS because he wanted to wait for the new Mac processors before getting a Mac.
Isn't it a total pain to write C on windows?
@MortenKromberg Seems like that bet paid off, from all the benchmarks and after-unboxing hype floating around :)
The M1 processor is a technological marvel.
I'd be curious to see if Dyalog will be able to exploit its capabilities.
11:49
@MortenKromberg None of the Linux guys write much APL at all. Even Marshall, who was on Linux, never got around to setting up an APL keyboard ― he'd copy and paste symbols from Vi!
@rak1507 the people who develop under Linux agree with you. The Windows guys love their VS projects and some of the debugging features available there. Everyone seems to hate Apple because they impose such bizarre things on you and keep changing the rules.
@MortenKromberg If they hate apple, why use Windows until you can get a new Mac?
It is true that the people who use Linux tend to be "engine room" developers and the Windows guys are more focused on applications and working with users. The people at Dyalog who work IN APL rather than C are slowly moving from Windows to Linux, at least for debugging after deployment.
@rak1507 The latest C developer is a kid straight out of Uni, so he's still a Mac fanboi
Marshall v2?
@rak1507 ask me again in ten years
11:57
lol
Or buy me a beer next time we meet
RGS
RGS
I was wondering what possibilities there are when trying to create "large" APL applications.
E.g. say I wanted to create a basic neural network framework. In Python I would create an object for a generic network and then create classes, e.g., for the activation and loss functions.
And then a user would create a network and possibly assign different activation functions to each layer and any of the loss functions.
In APL I have no idea how to build something with this type of flexibility.
probably would be just functions that you pass as operands to some "run" fn?
You could have a top-level generic network object in APL too.
RGS
RGS
@MartinJaniczek Yeah, but an operator is restricted to 2 operands, right? What if I need more things?
@Adám so you are suggesting I have a look at OOP in APL, is that it?
12:13
Right. We're back to the question of more than two args and destructuring. Namelists in tradfns are probably better approach once you start hitting that limit.
In APL I would avoid using objects, and instead go for a table driven description of the network, perhaps containing the names of the functions - or if that is distasteful a namespace containing the function. I would stay away from OOP in most cases.
Either that or, as Morten says, pass in an object as a way to provide multiple named arguments. This also makes for a convenient way to leave something with its default: Simply omit it.
... but I'd need to know more about the structure in order to make a more detailed suggestion.
RGS
RGS
@MartinJaniczek I am ok with passing 3 or more values. My issue is with non-array things.
I can have arrays of namespaces, correct? That I can deal with. I could have each layer to be a namespace with references to the different things I need.
options←⎕NS ''
options.activate←{..}
options.loss←{...}
12:15
@RGS values1 ((fitnessFn activationFn backPropagationFn)run) values2 is probably doable but kinda meh
(I was about to post the same as Morten, almost letter-by-letter.)
@MortenKromberg It's pretty nice how low-traction that is.
It'll become even neater when we have array notation:
namespaces are what I think some languages refer to as "dynamic classes"?
to me they're more like dictionaries
RGS
RGS
12:17
@MartinJaniczek I have done something like that already: github.com/RojerGS/workshops/blob/master/…
options←(activate:{…} ⋄ loss:{…})
I should probably do that in my own code instead of juggling ⍺ ⍺⍺ ⍵⍵ ⍵ around between functions where each means something else (and they're already containing multiple items themselves and need to be destructured)
RGS
RGS
Now I'm looking for something with more flexibility.
@MartinJaniczek wait, how do you intend to give 3 functions as the left operand to the run function?
@RGS the way I wrote it. You need to destructure inside run though.
{
  fn1 fn2 fn3←⍺⍺
  rest of fn
}
you can't have an array of functions
12:30
you can't?
RGS
RGS
@MartinJaniczek That is why I was asking for alternatives.
@MartinJaniczek it just makes a train in this case. i.e. (+/÷≢) isn't a function array
Huh. Well the NS approach seems to win on readability and ... being possible axis then :D
It also has the (imo) huge benefit of being able to use any order and skip things.
Maybe one day we'll get destructuring of a namespace argument as part of the tradfn header:
∇ foo (activate: ⋄ loss:)
12:35
On the one hand, destructuring :) on the other hand, tradfn :(
RGS
RGS
@rak1507 *On the one hand (...), on the other hand (...)?
RGS
RGS
:D
dfns already don't have automatic destructuring. Though you can do it manually with (a (b c))←⍵. I can't think of a good syntax to allow even manual destructuring of a namespace while also auto-localising the names.
@Adám why not just (activate: ⋄ loss:)←⍵?
12:39
Maybe.
Essentially, it means copy those names from that namespace into this scope.
@dzaima (i don't particularly like that syntax, but there aren't many alternatives)
BQN has ⟨a,b⟩←𝕩 with ⟨newA⇐a ⋄ newB⇐b⟩←𝕩 giving different names for the created variables. Kind of abuses overloading of vector destructuring, but ¯\_(ツ)_/¯
00:00 - 13:0013:00 - 00:00

« first day (1449 days earlier)      last day (1502 days later) »