« first day (1379 days earlier)      last day (1291 days later) » 

8:17 AM
That feeling when you spend a few hours on an optimsation that is supposed to give you a 3x performance increase across the board, and you see a 20% decrease in performance instead.
Seems like my fixes broke JVM compiler inlining, making previously inlined code into dynamic calls. The performance improvement from the excessive computations I removed was absorbed by the much slower dynamic calls.
I am very surprised by the fact that KAP is consistently faster than GNU APL, sometimes by a huge margin. Even though for simple operations GNU APL has reasonably optimised code paths.
 
@EliasMårtenson GNU APL is sometimes horribly slow. E.g. when they added ⎕DLX (knuth's Dancing LinX), we found that its performance was far worse than our APL implementation.
 
@Adám true, but I was surprised that KAP beats it even on simple cases such as +/⍳N
Neither KAP nor GNU APL has special optimisations for it.
 
8:33 AM
How does it stack up against Dyalog's +/⍳N and 1⊥⍳N?
 
By the way, KAP easily beats Dyalog on operations that involve {...} functions :-)
 
Do you have full lexical scoping on those?
 
@Adám Not at all. KAP takes 0.9 seconds to compute +/⍳200000000
GNU APL is approximately 10 seconds.
 
(GNU APL's "dfns" are just tradfn wrappers.)
 
@Adám Yes. Full lexical scoping, with proper closures.
(they have to be, since it's using lazy evaluation, the computation may happen outside of the lexical scope.)
 
8:35 AM
@EliasMårtenson Dyalog APL does that in about 0.2 s on my machine.
 
Yes, but try {⍵+⍺}/⍳200000000
If I recall correctly that one runs very slow in Dyalog.
 
Indeed. 1.5 mins!
 
I don't understand why it's so much slower than plain +. When I played around with it I assumed that it had a special optimisation for +/.
20 seconds in KAP, and half of that time is spent allocating new stack frames when calling the closure.
I really need to do something about the slow stack frame allocations. Only 14% of the 20 seconds is actually spent in the computation part.
@Adám Yes, they kind of work for simple use cases, but the lack of lexical scope is a problem. The fact that you cannot put more than one expression in them is also annoying, forcing you to over-use ⊢ and ⊣.
@Adám Was the ⎕DLX implementation slower than the APL implementation on Dyalog, or the APL implementation running on GNU APL?
 
9:12 AM
@EliasMårtenson On Dyalog. That code can't easily be adopted to use on GNU APL.
 
9:25 AM
@Adám I suspect the code will not be faster than the native implementation when run on GNU APL.
The main focus for GNU APL is compatibility with APL2. Performance comes second, and extensions a distant third.
 
@EliasMårtenson Do you know if GNU APL is partially implemented in APL?
 
@Adám It's mostly C++. There are libraries written in APL itself, but not that much. For example, the functions in the SQL library are mostly one-line wrappers to call into the native backend, with a few functions that have a bit more non-trivial APL code. I know this because I implemented the SQL support :-)
Things like the IO library is the same.
 
@EliasMårtenson [citation needed]. GNU APL gives the same result as Dyalog for 2 2/¨'ab' (wiz. 'aa' 'bb') whereas APL2 gives something else ('aaaa' 'bbbb'). APLX does like APL2.
 
Interesting.
@Adám I think that warrants a post to the GNU APL mailing list.
I'm not sure I understand the APL2 result here. KAP gives the same result as GNU APL and Dyalog, and my implementation is based on the ISO spec. A lot of GNU APL is also based on that spec, so perhaps that's where it comes from.
How does APL2 evaluate that expression. I don't understand how you'd get anything but "aa" "bb"
 
@EliasMårtenson Well, it was (kind of) intentional. "Kind of" because, as opposed to what is stated there, the APL2 documentation does makes it abundantly clear how / etc are treated.
@EliasMårtenson Very simple. / is in APL2 always a monadic operator, equivalent to {⍺⍺/⍵}.
So 2 2/¨'ab' is the same as (2 2/'a')(2 2/'b') which is (4/'a')(4/'b')
 
9:38 AM
@Adám I'm sorry. It may be simple to you, but I feel pretty stupid. How can / be interpreted as an operator when there is no function to the left of it?
 
@EliasMårtenson Operators take operands. An operand can be either a function or an array. For example, Rank () takes a function left operand and an array right operand.
 
@Adám Sure, but the operator / doesn't take a numeric left operand.
 
The At operator (@) can even take two array operands: ⋄ (0@3) 10 20 30 40
 
@Adám 10 20 0 40
 
@EliasMårtenson but it does in APL2 apparently
 
9:43 AM
@EliasMårtenson In Dyalog it doesn't, no, because it is a weird (but useful, and sometimes frustrating) hybrid function/operator. But in APL2, it is a regular monadic operator.
@xificurC Hi there. Interested in APL? APL evaluates from right to left, just like your user name!
 
Hi @Adám
 
@Adám My parser is a single-pass left-to-right LALR parser, so dealing with operators that take numeric arguments is... somewhat difficult. I have some ideas how to deal with it though. I'll need it in order to be able to handle ⍤ specifically.
 
I've been interested for a long time :) I collect languages and paradigms, and this one is missing
 
@EliasMårtenson Also, otherwise the users won't be able to general operators themselves.
@xificurC I'll be happy to give you a quick personalised intro. Want that?
 
@Adám what would that look like?
 
9:46 AM
@Adám Oh, that they can. What you cannot do is to redefine a symbol's role while the code in question is running. You have to predeclare a symbol's role before the code is parsed.
Defining a funciton/operator declares its role.
 
@xificurC Normally, I just chat with people here in this room. But if you prefer a video call, I can do that too.
 
But if I redeclare a function, you need to recompile the functions that use it.
 
@EliasMårtenson how do you handle a+a←1 then? a's type is unknown until you see the a←1 further right
 
before diving in I'd like to clarify some things though. J and APL, what's the status/difference?
 
@dzaima It assumes it's a value, since a has not been defined to be a function/operator.
 
9:49 AM
@EliasMårtenson ideally operators just wouldn't care at all whether the operands are arrays or functions, and deal with them with some common supertype. How would custom operators deal with the function/array difference, though, is a good question
 
@xificurC J has some rationalisations and additions to original APL (though some modern APLs are adding many things from J) with special emphasis on tacit programming. Also, J uses ASCII only, often resorting to bi-glyphs or even tri-glyphs.
 
If you want to dynamically refer to functions as values, you need to use the λ symbol. However, this is rarely needed (normally only used in defsyntax definitions)
 
@EliasMårtenson So how can you handle /'s dual role?
 
@EliasMårtenson ah, so you could never allow a train of a+(a←÷) which would be equivalent to ÷+÷
@Adám it's role is known at compile-time
 
and to put things into perspective - I'm a programmer for ~7 years, mostly backend, had the luck to write clojure for the past 1-2 years. I am wondering, is j/apl usable in this sector? My typical "problems" are working with the database, scheduling/spawning/managing jobs/processes, handling http (json), writing tests to already written shitty java code :)
 
9:51 AM
@dzaima Ah, because either it has a constant (function or array) on its left, or a name which has previously been declared?
 
@Adám Current. That's invalid syntax in KAP, and can never be implemented like that. You're going to have to use a different syntax for that.
 
@xificurC Yes it is. Modern frontend is more problematic, but as a backend array cruncher or complex algorithm handler, it works fine.
 
I haven't implemented support for this stuff yet, but I'll probably use the function combination symbol for that (was going to use ∘)
 
@Adám yes, I understand those differences, but is it applied in the same fields?
also, where are the package managers? Does one write an http server in either of them? Does one handle structured data in them?
 
@EliasMårtenson Ah, so / can only take a "raw" function, not the name of a function?
 
9:54 AM
@Adám The dual role of / in handled by a special rule in the parser: After seeing a function, the operator role take precedence. So, if you have x/y, the parser first sees x, determines it's a value (because it's not been declared as a function), anything that comes after is parsed as an operator if it can.
@Adám It can take a name of a function, but the parser must know at parse-time that the name represents a function.
So x/y is parsed as VALUE FUNCTION/ VALUE if the role of x and y are unknown. If you have previously declared x as a function (for example by a function definition instruction), then it will be parsed as FUNCTION OPERATOR/ VALUE
 
@xificurC Speaking about APL, as I don't know enough about J: Of those things, handling JSON over HTTP is certainly done and easy (we have a ready-made HTTP server, and a built-in for JSON-to-APL/APL-to-JSON conversions). Interfacing with the world outside sometimes easy, sometimes hard ― depends on what exactly is being done. We have an easy-to-use SQL interface too.
 
So yes, the parser is affected by previous definitions. It's simialr to C in that way, where previous definitions (esp. typedef) can affect how the parser parses an expression.
SQL is a perfect match with APL, I'd say.
 
@xificurC Some APLs have a full OO system too.
@EliasMårtenson Maybe for KAP, my strict naming convention would be good? It'd allow you to declare the type of a name simply by its spelling.
 
@Adám Actually, I did consider that initially. My first idea was to assume symbols starting with an uppercase letter to be functions.
 
@Adám doesn't work for ⍺⍺/⍵⍵ for which it matters the most, and in all other cases it's just pointless, and forcibly makes operator names longer
 
10:00 AM
@EliasMårtenson Exactly. But take it further: Symbols beginning with _ are operators, and if they also end with _ then they are dyadic operators.
 
@Adám It's been a while so I don't recall exactly my line of thinking, but at the end of the day I decided that the limitations wasn't worth the benefit. I figured if you wanted to introduce such rules, it would be a trivial extension to the type classifier to take the name into account. I think it could be exposed to the user so they could implement their own type classifier in KAP itself.
 
@dzaima One could use ⍶⍶ and ⍹⍹ for function operands.
 
@Adám GNU APL uses ⍶ and ⍹ for function operands. I'm going to use the same syntax. This is because of of how the tokeniser works. A character can either be single-character or multi-character. ⍵ is single-character, which means that ⍵⍵ is parsed as a single symbol. The reason is that everything is a symbol, even + and /.
 
@EliasMårtenson why exactly though? I don't think any parsing method should prevent from treating functions and arrays the same sometimes
 
@dzaima The question is "when" should they be treated the same. The dual-behaviour of / shows how the entire expression must be parsed completely different depending on context. If that context isn't known at parse-time, you have to re-parse every time you execute a function, which is why GNU APL is so slow for defined functions.
 
10:06 AM
For +/⍳200000000, I get a ws full, surprising, I would have thought it would be optimised to calculate the nth triangular number
 
@EliasMårtenson that context is still known at parse-time though, that still hasn't changed
@rak1507 this + my reply 2 messages down
also would be nigh impossible to get it to (in)correctly round when the result is in the FP limits
 
@dzaima As long as the context is known, it will work. I mean, the parser knows about lexically scoped local functions. So a symbol can be treated as a value in one place, and inside a function the symbol can be treated as a function.
 
Fair enough
 
@EliasMårtenson so where's the problem?
 
@EliasMårtenson I don't think that's right. Doesn't GNU APL use and for operands, no matter the type?
 
10:10 AM
@dzaima I think we might be talking about different things, because I'm not sure I understand your question.
 
@EliasMårtenson you said that handling operators with array arguments is somewhat difficult, whereas i'm surprised it's not trivial (beyond the need to change the operator interface)
 
@Adám ⍶ and ⍹ are operator arguments, so {⍵ ⍶ ⍺} is an operator.
 
@EliasMårtenson but is that a function invocation or a strand of 3 items?
 
@dzaima Ah, it's difficult due to implementation details. Conceptually it definitely works, as you suggest.
 
@EliasMårtenson Right, but can be an array. I was suggesting using ⍺⍺ and ⍵⍵ for array operands while ⍶⍶ and ⍹⍹ indicate function operands.
 
10:12 AM
Those particular problems I was referring to was due to the simpler implementation I went for before I thought about the need for numeric arguments to operators. The only one defined in the ISO spec is ⍤ so I was considering handling that one as a special case.
@Adám I don't think it can be, in GNU APL.
 
@EliasMårtenson I just tried it. (2{⍵⊢⍶+⍹}3)'dummy' gives 5 in GNU APL.
 
Later I realised I need a generic way of handling array arguments to operators, at which point I needed to make some major changes to the parser.
@Adám OK, I did not know that.
 
another option would be to be able to specify the operand types in the dfn itself, aka dfn headers. (though i don't have any syntax ideas for that either)
 
11:05 AM
@dzaima I might pass the operand as a value, and if it's a function it becomes a function value. I know that may sound like it makes no sense, but the short summary is that to call it as a function you need to use the APPLY operation.
 
@EliasMårtenson ah, so & are always values and you just need to call them in a different (but already existing) way?
 
@dzaima Yes. The KAP syntax for calling functions-as-value is the ⍞ symbol (don't ask me why I use it, it was just available).
So if foo is a first-class function value, I call it using ⍞foo 1 2 3
 
@EliasMårtenson Why not have a normal-syntax monadic operator to apply function values as functions?
 
@Adám Very good question. I don't have a good reason.
 
CMP: What would be a good way to describe parens and brackets that syntactically (i.e. not inside an inner dfn) have a line break or a diamond between the opening part and the closing part? E.g. [ 1 2 ⋄ 3 4 ]. "Broken"? "Interrupted"? "Segmented"? Something else?
 
11:20 AM
If I can't think of a reason, I will change it. Thanks for the tip.
 
@EliasMårtenson Do you have generalised stranding? I.e. a b c forms a vector.
 
@Adám Do they need to be called something specific? I mean, X⋄Y is just Y (with X evaluated for effect).
The fact that it's inside an paren or bracket shouldn't change the fact that they are just a value.
 
@EliasMårtenson it's not though
 
@Adám a b c is a three-element vector of whatever a, b and c are. Similar to Dyalog and GNU APL.
 
@EliasMårtenson I need to speak about them, and no, it isn't a simple expression. Currently a syntax error, which we're planning to give a meaning.
 
11:22 AM
What would it mean
 
@EliasMårtenson What if b is a first-class function value?
 
@Adám Oh I see. So will you give it the meaning I said? Simply execute the elements in order and return the last one?
 
@rak1507 An array that has two major cells. Equivalent to ↑(1 2)(3 4) (with the Dyalog meaning of ).
@EliasMårtenson No, that is usually pointless, unless the leading statements have side effects, but then you might as well put that outside the bracket.
 
I see. I wanted that behaviour for consistency. What do you intend to have it do?
 
@EliasMårtenson [a ⋄ b ⋄ c]↑a b c; (a ⋄ b ⋄ c)(a)(b)(c)
 
11:30 AM
@dzaima I don't understand the need for that. How is (a ⋄ b ⋄ c) different from a b c?
 
@EliasMårtenson requires less parentheses, is clearer, and allows for each item to be on a separate line
also allows for (a⋄) for a 1-item vector, but that's ugly
 
@dzaima I see. Interesting solution to a problem I was facing: How to neatly declare large arrays of data directly in source code.
Repeated z←z,⊂ ...more content... is not very pretty I think.
 
@EliasMårtenson That is exactly what we're addressing. See here.
 
@EliasMårtenson exactly, that's what this is meant to solve
 
@dzaima I see. The video describes it pretty well (watching it now). I have been thinking of using « 1 2 3 4 » for that.
 
11:48 AM
@EliasMårtenson You're not the only one thinking that simply surrounding a strand with some paired symbols can work, but it is a mistake leading to a contradiction. If « 1 2 3 4 » is 1 2 3 4 then clearly a←1 2 3 4 ⋄ « a » must be 1 2 3 4 too. However, if you say that « 1 » is ,1 then « a » must be ,⊂a. However, for all but simple scalar as a ≢ ,⊂a so this notation definition contradicts itself. QED.
 
@Adám a simpler question is what should « 1 2 + 3 4 » be
 
@dzaima Good point. Or even « ⊢ 1 2 3 4 »
As they say in Swedish: Oj då!
 
@EliasMårtenson having a separate character for the notation is quite useful (it's what BQN does with ⟨⟩), allowing for trivial 1-item and 0-item vectors, but takes up 2 more keys on the keyboard (if ignoring the need for another 2 chars for matrix notation)
 
12:03 PM
@dzaima Yeah, I've held back on this stuff until I get most of standard APL implemented. I don't want to introduce new symbols until I have to.
 
@EliasMårtenson yeah, that's understandable
 
I also want to work on making the REPL more dynamic. Being able to work with some kind of graphical representations of objects would be neat. It's a topic I'm very interested in, and my other project I'm working on is all about that: peertube.mastodon.host/videos/watch/…
 
12:19 PM
I'd like a VR 3D array editor/viewer app. I still think 4D arrays can be projected onto 3D in a way that our brains can learn to understand.
 
Anyone got ideas for an "array languages" logo?
 
@RikedyP Array Programming Languages in general?
@RikedyP Maybe something like this but of the letters A P L:
 
@Adám I figure APL specifically can adopt the APL wiki logo. The question still remains about whether topanswers.xyz/apl should be APL or Array languages. Given the recent discussions here, I'm still undecided which way to go. The stream of conciousness here is still active and should and will continue, but I still think new people might benefit from the compartmentalisation of topanswers
 
Any volunteers to render such a 3D logo?
 
@Adám i might or might not try
 
12:33 PM
@Adám Ooooh so orthogonal
 
@dzaima Won't we all? ;-)
@RikedyP Programming language logos generally have the name or initial(s), or a ubiquitous language phrase, or, for functional programming languages, a λ. I can't off-hand think of any logo for a language family.
 
@Adám Maybe r/apljk is really the place, but topanswers still has the appeal of forum posts + comment section + interpreter integration. The logo is just the last piece before we can say the design is good to go. Maybe considering the APL terp is the only one implemented, could go with just APL for now? What about the old Dyalog logo that used to be a 3D APL?
 
@dzaima quick & dirty mockup - the A got a bit eaten..
 
@RikedyP Yeah, but even if touched up, it isn't as good as a true GEB cube.
@dzaima Hm, yeah, you need a deeper loop in the P so you have material to carve the A out of.
 
@Adám Yeah but I worry that's a bit complex for a logo
 
12:51 PM
@RikedyP How about going with the perspective view of a cube (looks like a hexagon when flattened)? Each language can in turn adopt a variation thereof, while the language family uses a more generic cube (maybe made of smaller spheres, APL Wiki logo style)? NumPy, Dyalog APL, and APL2 already have such logos:
@dzaima Can you render 8 spheres in a 2-by-2-by-2 configuration with a perspective similar to the NumPy logo?
 
@Adám Yeah this is a pretty good idea actually
 
@Adám that's leaving out a lot of details, but sure
 
@dzaima My APLPhys renderer looks like this lol (just spheres from Babylon.js) - don't mind it though looks quite nice
 
1:31 PM
Looking at IBM's download page for the APL2 demo, it's dated 2002. That's 18 years ago. Is it safe to say that APL2 is no longer being developed?
 
1:45 PM
@Adám I'm thinking of something like the NumPy cube, but with a different number of segments along each axis. In a large version, the "front" face (bottom left; maybe angled more towards the viewer but maybe not) would have APL written in three segments and other segments would have J, K, etc. So it'd be 1x3x2 I guess.
@RikedyP I would post on topanswers, even though I won't use reddit or non-chat stackexchange (horrible website and company, respectively).
@dzaima FYI Dyalog doesn't always enforce floating-point rounding on integer sums: for example +/(2*23 10)/2*30 0 is larger than {⍺+⍵}/⌽(2*23 10)/2*30 0 (reversing because +/ with singleton result goes in increasing index order).
 
2:00 PM
@Marshall oh huh. so it does internally just use a 64-bit int accumulator (or equivalent)?
 
@dzaima Even 128-bit if necessary, although nearly all addition will be kept in subaccumulators with a smaller type.
 
Does Dyalog have a maximum array size?
 
Dyalog's limited integer precision is :(
 
@EliasMårtenson Yes, maximum bound (number of elements) is given by the machine word size, so 2*64 elements on a 64-bit interpreter. That limit can only be reached with booleans, as otherwise you'll run out of addressable memory.
 
@Marshall Thanks. Dimensions in kap are limited to 32-bit numbers, and I'm starting to think that may have been a bad idea.
 
2:06 PM
That's still over 4 billion, I doubt people will need more than that
 
@EliasMårtenson hitting that limit is pretty hard. And i don't think kotlin has arrays with length>2*31 either
 
2:21 PM
@dzaima Correct. Array indexes in Kotlin are limited to 32 bit integers. However, I could easily implement support for longer arrays by moving to long. Arrays would be backed by multiple underlying vectors in the case where data is actually stored in an array (things like ⍳ returns synthetic arrays)
 
3:04 PM
@EliasMårtenson No, it is just their free version that is old.
 
3:52 PM
Is there an easy way to list all of the APL functions/operators? ⎕AV lists some (but not all) and is surrounded by alphanumerics and punctuation. Essentially the output I'm after is a vector of all of the glyphs on the language bar in any order (without having to type them out of course ;) )
 
@JamesHeslip that'd definitely depend on the specific APL, and at that point you can just copy from the docs
 
@dzaima Ah, sorry, I'm referring to Dyalog APL
 
@JamesHeslip i've written code a couple times that goes through ⎕AV, getting the nameclass of each, but ⎕AV doesn't include all chars, and things like `⎕⍞∇→ need manual filtering out
but i don't think it's built-in
 
It seems like a really specific use case, so I can understand why it's probably not in the system.
But the help is a pretty good start, good thinking.
 
@dzaima (this specifically)
 
4:01 PM
Can copy Table 25 into a variable, and remove ⎕UCS 9 10 13 32. Yields +-×÷|⌈⌊*⍟○!?~∧∨⍲⍱<≤=>≥≠≡≢⍴,⍪⌽⊖⍉↑↓⊂⊆⊃∊⍷/⌿\⍀∩∪⍳⍸⌷⍋⍒⍎⍕⊥⊤⊣⊢⌹⍬→←.
I guess I'm just being lazy :P
 
4:16 PM
@dzaima It is, but I'm not allowed to tell you :-)
 
@Adám Are you allowed to tell me? :)
 
@JamesHeslip I don't know. I can ask. However, even if I can, you are not allowed to put it into code that is visible to others.
It is an 11-character expression that returns 01+-×÷⌈⌊*⍟|!○~∨∧⍱⍲<≤=≥>≠ .@≡≢⍴,⍪⍳↑↓?⍒⍋⍉⌽⊖∊⊥⊤⍎⍕⌹⊂⊃∪∩⍷⌷∘→←⎕⍞/⌿\⍀À¨⍣&⍨⌶#⊆⍥⊣⊢⍠⍤⌸⌺⍸()[];⍝⋄:⍬{}∇
 
must be some sort of debugging thing
 
@Adám that still includes punctuation & other non-function things. not much better than ⎕AV other than including newer builtins
 
@Adám I was asking more out of curiousity, it's not a necessity by any means. Just figured it must exist- feels like such a nice to have. *
*If you are tasked with producing a set of the APL glyphs, of course.
 
4:29 PM
(also fwiw paste has sets of APL glyphs, but that includes many outside Dyalog)
 
OK, I've found an APL expression that I am allowed to publish, but it is both long, and very slow.
 
@Adám Now I'm curious...
 
@Adám sounds hilarious, please tell us
 
Hold on, I'm testing it now. Takes several minutes to run.
 
ay yes, forgot about the several minutes part
are you looping through the entire unicode range?
 
4:35 PM
⎕UCS⍸{' '=⍵:0 ⋄ 0::0 ⋄ ∨/'Symbols' 'Primitive'∨/⍤⍷¨⊂⎕SE.UCMD'help -u "',⍵,'"'}¨'\w|\s'⎕R' '⍠'UCP'1⎕UCS⍳10000 gives !#&'()*+,-./:;<=>?@[\]{|}~¨×÷←↑→↓∇∊∘∧∨∩∪≠≡≢≤≥⊂⊃⊆⊖⊢⊣⊤⊥⌈⌊⌶⌷⌸⌹⌺⌽⌿⍀⍉⍋⍎⍒⍕⍟⍠⍣⍤⍥⍨⍪⍬⍱⍲⍳⍴⍷⍸○
'\w|\s'⎕R' '⍠'UCP'1 is only an optimisation and can probably be improved.
 
wait, is this for a question?
 
I was originally asking for a colleague, who is trying to do some automated testing.
That said, could he get permission to talk in the chat? (user880661)
 
@JamesHeslip I recognised his name and have already begun the process of gaining him access.
 
@Adám Thank you.
 
@JamesHeslip @user880661 OK, done.
 
4:45 PM
Thanks!
 
52 mins ago, by James Heslip
Is there an easy way to list all of the APL functions/operators? ⎕AV lists some (but not all) and is surrounded by alphanumerics and punctuation. Essentially the output I'm after is a vector of all of the glyphs on the language bar in any order (without having to type them out of course ;) )
 
4:55 PM
o
 
 
2 hours later…
RGS
7:01 PM
Been working on a YT series on "learning APL with Neural Networks" (https://www.youtube.com/playlist?list=PLgTqamKi1MS3p-O0QAgjv5vt4NY5OgpiM).
Thought some of you might enjoy it. It is currently halfway done and it is supposed to be suitable for skilled and non-skilled APLers, as well as people who are and are not familiar with Neural Networks. If you watch it, be sure to let me know your feedback and ideas for improvement.
 
Brilliant!
 
7:29 PM
You shouldn't/don't have to apologise for your English, it's completely fine (to me anyway)
 
RGS
7:56 PM
Thanks @rak1507, let me know if anything else pops up.
 
 
1 hour later…
9:23 PM
0
Q: Currying in GNU APL

ᆼᆺᆼI was trying to "curry" a function in GNU APL, however it doesn't seem to work? For example: (1∘+) 1 SYNTAX ERROR (1∘+)1 ^ ^ What am I doing wrong? Is ∘ the wrong glyph to use?

 
10:14 PM
@RikedyP My take:
Could be made non-awful if desired.
 
@Marshall What about Mathematica, Fortran, R, MatLab, and BQN? On the back, I presume…
 
@Adám R is there. Those other languages better find some shorter names.
 
@Marshall Oh, right. You can fill the empty slot with an O.
@Marshall How does it look if you rotate the cube so the nearest corner is directly facing the camera, like in the NumPy and Dyalog logos? Oh, never mind, it isn't a cube.
 
@Adám Not as good. And anyway, it should emphasize APL.
 
I still don't know if there's a purpose in having a logo for a loosely related family of languages.
It be like having a C/C++/C# combo logo.
 
10:24 PM
I think they're pretty closely related. Julia is the only one not designed entirely around array programming (and should be behind NumPy now that I think about it).
 
@Marshall If J→I and K→Q then S→R, no?
 
@Adám It's a logo for a possible forum, intended to express the topics it covers. Both the forum and logo seem useful to me.
@Adám In theory, but it would probably take extreme effort to even run S these days.
Including I is highly questionable. It's vastly more obscure than the others.
 
@Marshall Yeah, I think you could remove I and Q, instead stretching J and K to 1×2. It'd give a nice progression that the NumPy and Julia letters are 1×1, while J/K/R are 1×2, and A/P/L are 3×1.
 
10:55 PM
@Adám The current version uses the faces of a 1x2x3 array. If you merged squares along the top, it wouldn't be an array at all, just stickers on a cube.
 
@Marshall Hm, good point. Maybe a 3×3×3 array with plenty of empty squares. The left-facing side could say: ⎕⎕⎕/APL/⎕⎕⎕, the top would say J⎕⎕/⎕K⎕/⎕⎕R, and the right side would say NumPy/⎕⎕⎕/Julia (two long names on 1×3 stickers)?
Maybe the right side could even fit Matlab?
 
@Adám I was thinking to just fade towards the back so you can't see I and Q as much.
Also, the small version would have to just say APL if there is one.
 
@Marshall You mean like a favicon?
 
@Adám Anything under ~100 pixels really.
 
@Marshall Fairly readable at 64px:
 
RGS
11:10 PM
I read Dulia on the side and KO on the top
 
@Adám It's a lot busier than you'd want it to be though.
 
@RGS That's because the background is off.
 
I guess the more closely related languages deserve the right side (which seems more readable)
 
That'd be all the 1-letter ones, except S&R?
Where's A/A+?
 
Kind of.
 
11:18 PM
How about this: A cube with the two front facing sides saying:
┌┐┌┐╷    J K
├┤├┘⌊    Q R
NumPy   Julia
And the top being empty or 9 squares.
 
That... might give the impression that the whole APL family was built upon the bases of NumPy and Julia
 
:-(
 
{p⌷⍨⍸⍵≡¨⍥⊆⊃¨p←({⍵/⍨≠⊃¨⍵}⊢,⍥,((+,-)↓⍉2⊥⍣¯1⊢⎕A⍳'ABCDFGHLN')∘.{10|⍵,⍨⊂⍺+⊃⍵}⊢)⍣≡⊂⊂4⍴0} doubt I can get this to below 40 bytes to reclaim my title :(
 
@rak1507 (+,-),∘-⍨
@rak1507 Not sure about it, but can ⌷⍨⍸ be ⌿⍨?
 
Maybe, and ⊥⍣¯1⊢ can just be ⊤ in extended, right?
Definitely golfing potential
 
11:27 PM
@rak1507 Yeah, but you'll end up in trouble with ¨p since I've not implemented my theoretical fix for that bug.
 
Ahh, that's what caused it to not work on TIO
 
A workaround is to insert a to the left of p
 
Would need to define ⍥ as well
 
@rak1507 No, that's in Extended.
 
Oh
Is it the regular one that it's not in on TIO?
 
11:29 PM
Yeah, it was in Extended for a long time before it was adopted (partially) into vanilla 18.0, while TIO is on 17.1.
 
,⍥, that's an interesting use case of btw
 
I've done that on occasion.
 
It is pretty hacky
 
Not really, it reads nicely as "concatenate ravels"
 
I don't need it, ,, works instead of ⊢,⍥, I think
Oh no, it doesn't, my bad
 
11:32 PM
You're tacit at that point.
 
Yeah, I forgot that there was a left argument
Oh wait there isn't
 
This is pretty unreadable, especially when awkwardly wrapped in chat.
 
Ah I need to ravel the outer product result too
I'm off to bed, I'll try and golf this more tomorrow, bye ○/
 
○/
 

« first day (1379 days earlier)      last day (1291 days later) »