« first day (1461 days earlier)      last day (1186 days later) » 

12:13 AM
@dzaima do you have an invite link to that discord?
I couldn't find one searching briefly
 
That's not an invite link
 
@ngn my last revision of thoughts on how to do multitype vectorizable arithmetic (before it faded away on a todo list months ago) was to have a separate mini-language where you can define operations on any abstraction level you want, which gets statically compiled to a horrible mess of a lot of code
 
thanks :)
 
ngn
@dzaima macros?
 
12:28 AM
@ngn even if macros could do all of what I'd want that to do, I doubt the result would have any sanity
i'll think about it more tomorrow
 
ngn
@dzaima c macros are very annoying because they lack recursion and you can't do things like "each" with them (at least not in a simple way)
 
If anyone wants to get together on a b-ish (Whitney's b) vector language I'd definitely contribute.
I used C++ template metaprogramming in Dyalog and did not enjoy it.
 
ngn
@Marshall that would be awesome
 
@Marshall how come (for both)
 
ngn
unfortunately b itself was published without a license and that makes it unusable for us, f/oss enthusiasts
 
12:42 AM
@Marshall definitely; though for now i must sleep
 
@dzaima Yeah, I'm busy right now too. Probably best to think about it independently for a little while anyway.
 
oh i've had plenty of independent thoughts
 
@dzaima Lies
 
ngn
lol :)
 
:)
 
12:45 AM
@rak1507 Because it was the only way I could see to handle type conversion cleanly, and because C++ templates are not at all designed for that task.
You can't do partial template specialization on functions, only classes. So I had to make a bunch of classes just to hold functions.
 
sounds painful
 
ngn
1:02 AM
@Marshall btw, @ktye has been experimenting with such a b-like language, but targetting wasm, not x86_64
it looks like this: github.com/ktye/i/blob/master/t/w.k unreadable! :)
 
@ngn I'm interested in SIMD specifically here (which I think requires a different design). But it should be general enough to target NEON or a Wasm vector extension whenever that appears.
 
 
7 hours later…
7:46 AM
it is not unreadable, even comes with documentation: https://raw.githubusercontent.com/ktye/i/master/_/i3/w/readme
what you linked to, is a reimplementation of the compiler in k. Because it was so slow, i translated w (which looks close to k) directly to k syntax. Now k can parse it natively (not execute, because it's a scalar language) and translate to machine code: https://raw.githubusercontent.com/ktye/i/master/k.k (currently only the go-code generator is implemented).
@Marshall kelas is currently working on a language derived from b: https://github.com/kparc/bcc
 
oh my god, this is amazing
 
and you can try it online: ktye.github.io/w.html
 
 
1 hour later…
9:18 AM
how i envisioned multiplication pervasion (mostly just the style of dispatching, not the actual vector language or impls):
https://dzaima.github.io/paste#0dVbNbuM2EL77KWYvWymQZWQbBIs6yaJpLhugCxQBWsA3WqQsOrLokpQt7TY99gF66QP1Tfok/YaUtE6CDRyHQw6/@ftmmL2yB@G0aUhqtxe@qJQl3@@V@2HGf0j4HR1UMaO19hR@VjQj0u@jcAtBn19G4YGF79/hFMJHFi4viLYQ7mmxINPUPemSdOMdiUZSWRvBS6vIqb2wwitKdK5yaoyn218@pTMqGUIC4o7NFoPZHyEUo9nfWGCzBYSfWO0MiwN@f53NZjAsVakb7TlKU5KvFO3a2ut9rQsRdvdW73B@ULMvuJ1ImZFV7vrL8ax7Stn1QjhFx0o1tDa@gsebwe1C1MKSNO26Vm7JPs@d72sVVWDtGCLtMkJiFW8MV0JyERzbu7vLOMcn9iB5Y/VnJQfs4MFyRAu2ow4c3WjnlXUZ7YR71M2GsHuskM
@dzaima (forgot to add (ZZ, vec={w&x}) for bools×bools)
 
9:32 AM
<moon-child> @dzaima why bother with c16?
 
almost nothing is gonna be c32, so the 2x space improvement seems good (then again, compared to c8, almost nothing is gonna be c16, so ¯\_(ツ)_/¯)
 
<moon-child> yeah. And add to that that character ops don't have to be super high performance
 
so most of what chars are gonna do is waste RAM, so better make it take less space
 
<moon-child> ram is cheap. Cache is expensive
<moon-child> and strings are unlikely to be very big anyway
<moon-child> so just allocate chars from a separate arena
 
moon-child: strings can be pretty big - e.g. json, xml - all non-binary interfaces with anything else
 
9:41 AM
<moon-child> interfaces with other tools will likely be all ascii
 
right, but of the unicode-ful cases I'd assume a majority would fit in 16 bits
 
 
1 hour later…
10:56 AM
 
ooh nice
 
Aw yeah, a little Vim magic and the RIDE tooltips are copied into the langbar :)
 
That's a great addition
 
I assume this wasn't done for the JS langbar right away because it tries to be language agnostic? (APL, BQN, ...)
 
I learnt most of the APL I know from hovering over those icons lol
 
10:57 AM
same
 
RGS
@rak1507 +← 1
 
@Adám let me know if you'd like a PR (in case I'm wrong about the agnosticness -> less examples in tooltips). As before, this version of the langbar lives at github.com/Janiczek/tryapl-elm/blob/master/src/langbar_hack.js
 
11:11 AM
@MartinJaniczek I'm not sure if the bookmarklet lb should do this, but can we steal this for TryAPL?
 
@Adám Sure thing! FYI: the function that creates the title has been changed a bit too, to give title first, then the completions, then the rest of the help
 
What happens if there's not enough vertical screen height?
 
With my custom CSS tooltips, it just hides. I assume native browser title="..." tooltips will do the same
 
Native ones have limited size, and abbreviate with … if needed.
 
11:16 AM
Good that Completions is first.
 
@MartinJaniczek unrelated: probably should re-focus input field when it's undisabled
 
@dzaima Hard-refresh the page, a few minutes ago I realized that and implemented it
 
oh :D
 
Hm, but when I later click somewhere else and then click the langbar again, it doesn't focus anymore. Hmm...
Ah, maybe it remembers the t from before so it doesn't go my shiny new focus-the-input path... EDIT: fix applied, waiting for gh-pages...
 
11:47 AM
@MartinJaniczek this is really useful and looks great too. well done!
 
^ Agreed
 
Thanks! It's certainly minimalistic. Credit goes to @RikedyP for making me aware of the "REPL" API :)
Some project management (persistence) might be bolted on top of LocalStorage ... since the API is stateless and you hold all state in a string
Also deleting of specific parts of the session log when you want to copy stuff somewhere, and the shift+enter/bksp keyboard shortcuts... but at that point I'm just looking for excuses to work on this :D
Trivial "Go back in time" (tree?) undo/redo functionality, restoring variable contents... the list goes on and on
 
ngn
12:19 PM
@ktye from kelas's faq: "there is no license. use at our own risk." me: presses ctrl-w
 
12:47 PM
@MartinJaniczek i forgot to mention ]help returms a url with \u08 markers
 
@RikedyP \u08, as in backspace? that's... an interesting choice?
 
@MartinJaniczek Yeah I mean what are you gonna do, type it?
 
Print everything by default :) I see that tryapl.org opens the webpage. Is that how it's intended to be used? if something follows \u08, interpret it as a link and open it? Or is it just hardcoded for that specific input
I think I'll just replace \u08 with \n or something... easiest way to unbreak this
 
1:07 PM
@MartinJaniczek Yeah it was intended to be a bit like F1 in the Dyalog session - and it only applies to ]help (all UCMDs need custom wrapping in TryAPL, we won't be relying on ⎕SE). In the JS we simply response.search(/^ *[\b]help[\b]/)
 
ngn
@dzaima in a real impl you'd probably want to extract the common parts in separate functions. for instance all dyadic arithmetic primitives require casting a pair of numeric objects to their common supertype
(unless for N types you want to implement N*N cases per primitive)
 
@ngn Casting in a separate function would double or nearly double the cost, I think. And each case will be less than about 100 bytes, so having many cases isn't really a problem as long as they're easy to generate.
 
ngn
@Marshall "double or triple the cost" - you mean for scalars? certainly not for (longer) vectors
 
1:23 PM
And note that for comparisons you can convert the larger argument down: it's easy to do saturating conversions until the larger argument is only one type larger, and possible but maybe not too efficient to convert it another step and store whether it's out of range.
 
@ngn casting to supertype could indeed have a common impl. But it also could not. With dynamic generation you probably won't hit the N*N limit anyway
 
@ngn Nearly double, not triple. What's your plan for vectors? I'm thinking you'd have to write the converted values, then the final result. And memory bandwidth is most of the cost of arithmetic.
 
ngn
@Marshall that's how i do it now - bring the two args to a common supertype first, then perform the requested operation
but i have only one function to do this: use recursion when necessary, throw domain errors for non-numeric types, bring to a common supertype. then it dispatches to a simpler function, based on type and ranks (atom-atom, atom-list, list-atom, list-list).
"atom" means scalar, "list" means vector
some of these simpler functions do clever (but still simple) things, like addiI() (that is, an int atom added to an int list) just swaps the args and delegates to addIi()
 
I'd expect that to be slower, but also whether to use that strategy or not should be up to the vector language user, I guess.
 
@ngn not in my paste, but i've also thought about allowing reusing definitions (and marking as commutative for doing that automatically)
 
1:35 PM
I'm thinking currently that the vector language should just build functions that read and write vectors (but can accept and return scalars as well), and assume fixed types. The dispatching would be handled by whatever calls those functions.
 
ngn
@Marshall if the alternative is to handle N*N cases instead of N, even if the N*N cases are automatically generated code, i'd rather not do it :|
@Marshall you're right about the vector language
 
@Marshall that's how I imagined it being implemented
 
@ngn So placing aesthetics of the object code before performance? I can't really agree, but it's your language.
 
ngn
the absolutely ideal solution would be a single function Array arith(int op, Array x, Array y) that writes x86_64 code in a buffer as a fused loop (type conversions and operation), and executes it :) but i'm not smart enough
@Marshall code size affects performance too
 
@ngn not really if it's unused (i.e. not in cache)
and if it is used, the extra cache usage is worth the ~2x speedup
 
1:44 PM
@ngn So benchmark both on a large program. Don't just assume the strategy that sounds good is going to be right.
 
@ngn that's pretty much what I'm thinking of (though i had in mind caching it for less overhead)
 
ngn
@dzaima but if the binary is large, the useful code will be scattered on different pages, so overall more pages will be wasted
 
@ngn and now you suddenly care about RAM page usage? :) (in response to you being fine with buddy allocation often wasting pages because powers of 2)
 
ngn
@Marshall right, but i have no time to experiment with all the ideas thrown at me
@dzaima suddenly??
@dzaima ah, i see :)
 
@ngn Sorry, I didn't mean right now. Test out both when we have a working vector compiler and it's easy.
 
ngn
1:47 PM
@dzaima cpus have separate caches for data & code
 
@ngn this is about RAM pages, which aren't separated
 
ngn
@Marshall sure
@dzaima there are different levels of caches, some separate them, other don't
it's black magic.. and neither you nor i really understand it :)
 
:)
@Marshall if you want to handle the last 5 elements with vector registers of length 8, in x86 do you have to use a mask register on every operation, or is there some other facility for handling this?
 
@dzaima hmm, depending on how the data is stored in memory you could do normal ops and then do a masked store at the end maybe
 
2:02 PM
@coltim right, that's the simple (and maybe better, i don't know) way out, but i'm curious about the vector case (thinking from the perspective of RISC-V where you can globally set a wanted vector length and that just applies to everything)
 
@dzaima oh I mean do an (unaligned) vector load at an index, picking up 8 elements (assuming the arrays have some buffer at the end), then do whatever ops, then vector-mask-store the ones you want to keep at the original index. anything beyond short vector lengths would probably invalidate this though
 
@coltim with error checking/size conversion, you'd want to also ignore the tail elements, so i assume all of those would need to be handled with masks too
 
how do I fold right?
 
@KamilaSzewczyk f/x,⊂y?
 
i think f/⌽ should be enough
 
2:11 PM
@KamilaSzewczyk isn't that fold left?
 
hmmmm?
i don't think so
oh wait, no, you're right
i thought that / is fold left by default
 
@dzaima hmm the tail of the (full) array, or of an individual vector chunk?
 
@coltim of the current (i.e. last) vector chunk
 
ngn
@KamilaSzewczyk someone should introduce you to apl's foldl of doom :) ⊃{..}⍨/(⌽vector),⊂seed
 
@coltim also, stupid question: what is 'unaligned'? If i'm trying to read 64-bit ints into a 256-bit register, does my address need to be a multiple of 8 (64 bits) or 32 (256 bits)?
 
2:21 PM
@dzaima hmm. I'm assuming that a series of operations are performed on each vector chunk, with a separate operation for extracting which "lanes" of the chunk had an issue (e.g. with a movemask). this could either be checked for an issue every vector chunk, or accumulated and checked only at the end. I guess the last iteration (possibly on a non-full vector) would need to mask out the dummy ending indices
 
ngn
@dzaima no simd?
 
@ngn a 256-bit register is obviously a simd register
 
@dzaima there's aligned loads and unaligned loads. aligned loads need to be a multiple of either 16 bytes (for 128-bit xmm/SSE), 32 bytes (for 256-bit ymm/AVX), or 64 bytes (for 512-bit zmm/AVX512). unaligned loads can be at any offset. on even relatively old CPUs there's not much of a penalty for using unaligned vs. aligned loads.
I think with AVX512 it gets a bit trickier since a cache line is 512 bits, so if your AVX512 load isn't aligned, it'll need to access two cache lines (versus just one if it was aligned)
my guess is that the latter is part of the motivation for increasing the number of loads/stores that can be executed each clock cycle (in the mostly unreleased intel CPUs supporting AVX512)
 
@coltim ah, interesting. so there might be value in handling start separately, but not necessarily. so a vector language should handle both
 
@coltim (I think this last iteration masking could be done only on the integer returned by movemask, without having to handle the vectors themselves specially (assuming you have dummy data at the end that's alright to run ops on)
@dzaima yeh, I assume if you're doing ops over the entire array you would be able to use aligned loads. but if you're handling a subset you would likely need to use unaligned loads (or some initial code to peel off indices until you hit something that is aligned)
I think the "peel off things until you get aligned" and the "scalar cleanup at the end" is part of why compiler generated SIMD code is a bit messy
 
2:34 PM
@KamilaSzewczyk I also find the right/left fold terminology confusing. Anyway, it is on APLcart as fold left.
 
@coltim that's what i've been assuming too; currently i'm thinking a vector language should have a global-ish state of masking, and a for loop iterating through vectors should set that state to whatever is beneficial (possibly also having a scalar definition too)
 
@dzaima are you familiar with ISPC's approach? I can't say I fully grok it but I think it borrows some concepts from GPU programming to have per-lane masking
 
@coltim seems it also has a global mask setting, which is what i imagined
 
CMQ: I'm working on ]APLcart ― what features would you want to see?
 
ngn
@dzaima regarding items past the end of a vector - that's a problem only for + and *, right?
 
2:46 PM
i'm working on making a zip3 operator, and i came up with this: {⎕←⍵⋄⍬}{0=≢⊃⍵:⍬⋄,↑(⍺⍺⊃¨⍵)∇(1↓¨⍵)} 'ex1' 'ex2' 'ex3'
it seems to give correct output
but it's obscured when i want to collect the results
(return for example omega instead of zilde)
 
@ngn - also has it, and ÷ has (-2*31) ÷ ¯1
 
@KamilaSzewczyk Obscured?
 
      {⍵}{0=≢⊃⍵:⍬⋄,↑(⍺⍺⊃¨⍵)(∇(1↓¨⍵))} 'ex1' 'ex2' 'ex3'
eee         xxx   123 0 0 0
 
@Adám view source code for the primitives to encourage deeper understanding, especially understanding of edge cases
 
i basically don't want to reflect the original vector shape
 
2:48 PM
@KamilaSzewczyk Can you do that with boxing on?
 
ngn
@KamilaSzewczyk ↓⍉↑?
 
      ]boxing on
Was ON
      {⍵}{0=≢⊃⍵:⍬⋄,↑(⍺⍺⊃¨⍵)(∇(1↓¨⍵))} 'ex1' 'ex2' 'ex3'
eee         xxx   123 0 0 0
      ]boxing on
Was ON
      {⍵}{0=≢⊃⍵:⍬⋄,↑(⍺⍺⊃¨⍵)(∇(1↓¨⍵))} 'ex1' 'ex2' 'ex3'
eee         xxx   123 0 0 0
doesn't make any boxes
 
ngn
@dzaima x-y can be x+-y
 
@KamilaSzewczyk OK, the result is flat. I don't quite see what's going on.
@Wezl Not in scope of APLcart.
 
@ngn hmm, i think i can easily rework it into an operator
i wouldn't have thought of that
 
2:50 PM
@ngn monadic - also needs overflow checking for -2*31, and now you're iterating through RAM twice, both with overflow checking
 
ngn
@dzaima with prefetch that's not so scary
 
@KamilaSzewczyk can you give an example of some inputs + outputs?
 
how do you plan to take 3 arguments in APL?
 
3-element vector as omega
 
2:52 PM
@ngn x+y and -y should both hit RAM throughput limit, so implementing x-y as x+-y (assuming they don't fit in cache) should still be 2x slower than x-y, no?
 
@KamilaSzewczyk yeah so what ngn said pretty much
 
ngn
@dzaima well, yeah, "should". i'll have to measure.
 
{+/⍵}{↑⍺⍺↓⍉↑⍵}(1 2 3) (4 5 6) (7 8 9) produces correct output
this can actually work as zip-N, which is amazing
 
@KamilaSzewczyk Can you explain this? I don't get the example. Where did 10 go, and where do 8 and 11 come from?
Input: zipWith3 (enumFromThenTo) [1,2,3] [3,5,7] [5,10,15]
Output: [[1,3,5],[2,5,8],[3,7,11,15]]
 
@ngn I think it's pretty safe to assume that calling 2 builtins is gonna be slower than calling one..
 
ngn
@dzaima yes. but you know, i don't like code and i want to have as little of it as possible :) if that's not too expensive, of course
 
wikipedia article for alpha and omega
looks funny to me
 
dzaima posted that yesterday
 
really?
damn
 
@KamilaSzewczyk (also that's spoilers!)
 
3:02 PM
i got sniped :/
 
ngn
so apl replaces pdf as the fourth most popular religion in the world :)
 
@KamilaSzewczyk This?
      2(↑dfns.to↓)¨↓⍉↑ (1 2 3) (3 5 7) (5 10 15)
┌─────┬─────┬─────────┐
│1 3 5│2 5 8│3 7 11 15│
└─────┴─────┴─────────┘
 
my imagination written as hypothetical vector language pseudocode:
https://dzaima.github.io/paste/#0lVTNbuM2EL77KWYvhbxwZKQNgqJKnEvaF1jfih4ocWwRK5EGSUtKt@mxD9DLPtC@SZ@k31A/TbIJFgVkSxwOZ7755htut6S8Vw9fPqfXylxe//obtefm8lqpbFz1Gxo/hg39crZVNM6Ssz977/yaPq1o2vZ0S6ppXKUiZzg0rAvabil6w4GiI8/nwGQO@DhU7mxjSO49mbghF2v2vYHDHCIgMJ6D85T1Ff1EfUGDvIeCvLz9GttEHVcRPp8kV1Ure5RsNdOxcaVqqFXho7FHqpyNPEQBIjBUwI59AJajCZF9EItl1qxTVJIct8JE1yE9qsFvLjrVZSwQmxiWDCECdQF7YyxrCnxSHpbmIdUweymrybp5mXI9pv9QqUZNdYCkaYmCdCPn3IHY6kAmUMkRiFGksikOko0khA2MJvlgy51SpyS58FG59mQaOZcYeFGlMV9XOYF7XK22i0wmWJmUAUjoo089C25CPClp/UxK4ZmU/p@QE
 
{+/1 2 3*x,y,z}.'1 5 10+/:!5 zipWith3 in K
 
@rak1507 K?
 
3:07 PM
yes
I remembered ngn posted something like that before
 
haha
 
ngn
@rak1507 yeah, zipWith is just ' (each)
 
@rak1507 Where do those three argument lists go?
 
3:15 PM
I still don't get it. How do I go from [[1,2,3],[3,5,7],[5,10,15]] to [[1,3,5],[2,5,8],[3,7,11,15]]?
 
enumFromThenTo [1, 3, 5] = [1, 3, 5]
enumFromThenTo [2, 5, 10] = [2, 5, 8] (steps of 3)
enumFromThenTo [3, 7, 15] = [3, 7, 11, 15] (steps of 4)
 
@rak1507 No no, I got that, and gave you an APL solution. I was asking about the K solution.
 
ngn
@Adám do you get zipWith3?
 
@ngn Yes, in K.
 
@Adám oh, the k solution doesn't do that specifically, it used a different function, not a K equivalent of enumFromThenTo
 
3:18 PM
@rak1507 Ah, that's what I suspected. Either that or I really have no idea of how K works.
 
ngn
{x+y+z} is a function of three args. ' is each. then the derived function is given three args with [ .. ; .. ; .. ]
 
@ngn stupid question how do I get 1%2 to be 0.5 (float division)
 
@ngn Yes, we spoke about this. I was missing the FromThenTo part.
 
ngn
@rak1507 convert one of the args to a float: 1.0%2
 
RE: BQN glyphs: does anyone have a preference for how tall up/down take/drop arrows should be? x-height? cap(X)-height? should they descend?
 
3:20 PM
{1+1%x}/1.0 yay
 
@Wezl I'd say like 1 or I
 
heh my font has text figures so those are different
 
ngn
@rak1507 if 1.0 is not a literal, conversion can be done like this: (`d$1)%2
 
I'm making pi be the same height as the numbers without ascenders, though
 
@Wezl probably shouldn't descend, but any height not smaller than lowercase letters is fine
 
3:22 PM
@Wezl They should exactly fit inside ;-)
 
@ngn what does ? use as a source of randomness?
 
ngn
@dzaima there's the answer to the second part - x%y can always convert to floats and return floats :)
@rak1507 it's deterministic, like in apl
 
what prng do you use?
 
just make sure it's not Mersenne Twister :')
 
@ngn well if that's what you want, sure
 
3:27 PM
@KamilaSzewczyk Right, you cracked that, didn't you?
 
@KamilaSzewczyk lol
 
@Adám yes
 
@ngn ah yeah that rings a bell, must have seen it before
 
⍝ xoroshiro can be reversed using a SAT solver, so it's even easier :P
 
ngn
3:28 PM
@ngn (also: a rare instance of me writing a comment :) )
 
how do you like, even maintain that
i accidentally wrote code like this before, but i got wrecked and had to rewrite it all
 
ngn
@KamilaSzewczyk is it faster?
 
@ngn nobody knows, my MT cracker is instant
 
ngn
but this is not a cryptographic prng
 
i didn't try cracking xoshiro with SAT solver
obviously it isn't
but it's a fun experience nonetheless
 
ngn
3:31 PM
crack it all you want :) it only needs to have certain nice statistical properties, and it needs to be fast
 
+ there are a lot of people who just use the default random from python for some stuff which i would benefit from cracking :p
 
ngn
there's no shortage of stupid people..
 
well, i'm glad that there are stupid and smart people, even though i'm the previous one
 
ngn
@KamilaSzewczyk if you're the only developer, shorter code is easier to maintain
 
fair, i can believe in that
 
ngn
3:36 PM
@KamilaSzewczyk you are not stupid
 
@ngn One person, no matter how good, can't compete with massive teams though
 
i dare to disagree
 
ngn
@rak1507 that's a very general statement
 
@rak1507 question is, how big that team must get until it gets better than one person
 
organizing teamwork is very time consuming
 
3:41 PM
Yeah there's definitely an optimal point, above which the effort of organising more people becomes not worth it, but I think that's more than 1
 
i sort of think software development cycles are a bit h
like this scrum whatever
 
2
A: Transpose a word cloud

RazetimeAPL (Dyalog Unicode), 107 bytes {x←' '⍴⍨×⍨2/⌈/⍴⍵⋄(⌈⌿↑⍸' '≠x)↑x⊣{x⊢←(⊃⍵)@((⊃⌽⍵)∘+¨↓0,⍪1-⍨⍳≢⊃⍵)⊢x}¨↓(⊃,/' '(≠⊆⊢)¨↓⍵),⍪⌽¨⍸2{1 0≡' '=⍺⍵}/' ',⍵} Try it online! Makes an over-big matrix of spaces, and adds in the required words using @. Then, crops back to the required size.

 
but if you find 2 or 3 friends who know their stuff
 
wondering if there's a bettter way to do this
 
and you have a good mindset then it's for sure more efficient
but that's assuming perfect working conditions which happen... checks notes... almost never
 
3:43 PM
rando update on my neverending prj for anybody whos interested: fixed heap perf issues. fixed a bug where it wasnt executing the correct block. fixed a bug where it wasn't setting the right number of slots. got permission to open source it. got core primitives implemented (but i suspect a few of them will need to be tweaked to be correct). still need to write a few opcode case, but its feeling closer and closer to "working".
 
Array languages remind me a bit of the compositional program SCORE that was regarded as one of the best, that some people still use, but despite that, it can't ever go any further because the developer was so insular that right up until he died he refused to collaborate with anyone else
 
ngn
@rak1507 and: compete at what? how do you measure efficiency?
 
@ngn Good question
 
@KamilaSzewczyk Want golfs too?
 
3:44 PM
here are my ugly but satisfying glyphs:
 
idea: APL but using chinese alphabet
 
lol
 
@Wezl I'd use these
when are you dropping the font
 
@KamilaSzewczyk With characters actually saying what they do?
 
@Adám possibly
 
3:47 PM
hmm I could try that
I'm learning kanji anyway
 
@Razetime weeb
 
but i doubt that you can like, express apl operations as single chinese characters
 
@Wezl every day I find a new code hosting website
@rak1507 I like cheap education
 
but these seem kinda unreadable:
perfect for builtin symbols
 
ngn
3:49 PM
you can assign semantics to any set of symbols
 
there's thousands od glyphs in kanji, it shouldn't be terribly hard to find a good one
 
@Razetime are you thinking of studying in japan? what
 
or you can simply infer from the radicals
 
ngn
@ngn the question is, would you or anybody else benefit from that
 
3:50 PM
<kritixilithos> @dzaima 'question is, how big that team must get until it gets better than one person' en.wikipedia.org/wiki/Diminishing_returns or how many people do you add before it gets worse than one person
 
@Razetime oh cool
 
oh, hi kritixilithos
 
@DyalogAPL I do APL to escape from economics!!! noooo
 
@Wezl Spiderwire looks so COOOOOOOLLL
 
<kritixilithos> hi @Kamila
 
3:51 PM
we met on #esoteric once or twice
as far as i remember
i was tweaking HackEso's instance of asm2bf
 
<kritixilithos> indeed
 
@Wezl if you add full APL glyphset support to spiderwire I WILL use it
 
@Razetime yes but it's horrible in practice, some glyphs look horrible stretched -> I only stretch them partway -> inconsistent height -> horrible spacing
 
I don't mind it
 
I also didn't understand the font size options on the editor, so it's tiny until you scale it
 
3:53 PM
<kritixilithos> and on #jsoftware actually, nice seeinh you turn to apl
 
oh, true
i was bugging people with my noobish questions
now i'm bugging people with my questions here
 
lol
 
i got to J thanks to b_jonas because I've seen him tweaking some J code and wondered what is this
it looked like a brilliant esolang to me so i had to learn it
and i somehow ended up learning small bits of J & apl :)
 
<kritixilithos> what do you think of apl vs j? iirc initally you said you didn't like the glyphs
 
@Wezl pushed but noooooooooooooo rendering problems
 
3:58 PM
oh noooooo
 
right now, hmm
1) APL seems to have a larger user base
2) APL's syntatical choices make more sense to me now
3) J seems to be supported in more places
4) writing APL outside RIDE isn't enjoyable, writing J is as enjoyable as everywhere else
5) J has ⎕io←0 by default and you can't change it so it's better
6) now that i learned APL, glyphs make a lot of sense to me, at least much more than (random letter): or .
7) it seems that you can find employment in APL
8) no good APL implementation is opensource, the best J implementation is opensource
 
@Wezl but it's still in an acceptable state -- it has all of ascii, I made it more consistent now, and at least it's in a reasonable size so fallback glyphs are visible
 
for example - i knew a few friends who use Arch, and I tried to get them into APL, they initially liked it, but after they learned that GNU APL is dogshit and Dyalog APL is the only reasonable implementation, and it doesn't support their system and it's closed source, they gave up
 
> it seems that you can find employment in APL

i feel like when an apl job surfaces its usually "word of mouth". i suspect K has a better job market.
 
i.. actually see no k users around
 
4:03 PM
@KamilaSzewczyk Don't they sit in the k tree?
 
@KamilaSzewczyk gnu apl isn't dogshit... it was written as an APL2 replacement for legacy users
 
that being said, i won't believe until i see it, and until i see it i'll treat APL as a nice golflang/problem prototyping lang for simple or very specific problems/esolang(pls don't eat me)
 
@dzaima Lots of strategies. In Dyalog arithmetic, I used the fact that array data has a whole number of words, so I only had to handle a small number of words at the end with half writes and quarter writes. Ideally you'd have a whole vector register of the space at the end. Just aligning to vector registers isn't enough in some cases since you might want to pass in an offset pointer, although this tends to affect stores more often than loads.
If you can assume the computation is at least one register long then you can also do a complete step for the last one but align it to the end, so it overlaps with previous ones.
 
well either way I think Dyalog APL is better and it's better for newcomers
 
@KamilaSzewczyk that's exactly how I see it
 
4:05 PM
@KamilaSzewczyk maybe, it depends.
 
i have.. bad memories of gnash :D
or virutally any GNU tool
don't you love it when your libc segfaults in isalnum or isdigit
 
@KamilaSzewczyk i could say the same about any win32 api
 
WinAPI is a bit questionable but in the end you can get something working
also it won't segfault at random.
 
plenty of stuff works on linux. and plenty of stuff segfaults on windows
 
ngn
@Marshall words as in 8bytes? or 32bytes?
 
4:07 PM
@cannadayr hey, you're not negating my point
i'm just against GNU, not Linux
 
@KamilaSzewczyk wat
 
@ngn 4 or 8 bytes.
 
what?
you have musl/mlibc/any other reasonable libc, which unsurprisingly, works on linux
you have replacements for gnu coreutils, gcc which is sometimes good but sometimes not very
 
GNU as in the organization? or the libc? or the compiler toolchain?
 
ngn
@Marshall how would you do alignment and "word" size if you were starting from scratch?
 
4:09 PM
@cannadayr GNU project
 
@KamilaSzewczyk philosophically?
 
no, software wise
including, but not limited to, GNU APL, GNU coreutils, GNU compiler collection, ...
 
@ngn I might try to split up large and small arrays, but I'd have large arrays use multiples of 32 (64?) bytes for sure.
 
@KamilaSzewczyk ok then. weird hill to take a stand on.
 
my GNU criterion is just $name=~m/GNU/
@cannadayr why?
I prefer suckless/unaffiliated replacements to GNU parts
 
4:10 PM
because the GNU project has done more for personal computing than any other project in the last 100 years
 
I have read the GNU philosophy, and coding standards, and actual GNU code, and it's a bit of a disappointment
 
I'm inclined to say that very small lists should just always use the largest type and go in vector registers, but you can only fit four doubles in an AVX register so that doesn't accomplish too much. Maybe you could use multiple registers?
 
well - for sure it hasn't made Hurd :)
 
ngn
@Marshall cool, that's what i do too - 32, but may switch to 64 later
 
@cannadayr ah, so you basically think GNU project has been the most important project in history of personal computing
i'd probably disagree with that
that's a very brave conclusion
 
4:12 PM
@KamilaSzewczyk as far as advancing user freedoms? yes.
 
@dzaima @ngn For the SIMD language, it would be nice to write variations on arithmetic using inflections. Maybe saturating arithmetic would be +. -. and overflowing versions +: *:? We'd need special syntax for the two result registers with overflows.
 
and i say that as somebody who started really learning software on BSD
 
@cannadayr okay, you misunderstood me
i didn't say that i disagree with them philosophically - I agree with them philosophically!
I'm against releasing code on cuck licenses
 
> cuck licenses ?
 
but the quality of software that GNU produces is a bit questionable
 
ngn
4:13 PM
@Marshall i decided not to that in ngn/k (small arrays in registers), it would probably be faster but too complicated for me. i don't have enough experience.
 
@cannadayr lukesmith.xyz/articles/cucklicenses - a bit overwhelming article at first
but i can absolutely relate to it
 
@Marshall I think @ktye had something like that for signed/unsigned/float ops
 
<kritixilithos> @kamila perhaps you'll be interested in news.ycombinator.com/item?id=25458080 re: gnu
 
@KamilaSzewczyk that person comes off as exceptionally well-adjusted
 
ngn
@Marshall "inflections" :) prior art: zig uses +% for wrap-around, and a plain + to detect overflows. i don't recall if it can do saturating arith
 
4:20 PM
@DyalogAPL that's a huge wall of text, i'll take a peek at it later
thanks for sharing it
 
ngn
@ngn +| has been suggested for the saturated version
 
@KamilaSzewczyk It's a little confused about the public domain. There's no legal basis for releasing work into the public domain in the US; you have to use a license. I use BSD-0 when I want to release with no restrictions.
 
@Marshall I would probably go with CC0; countries like Germany or US have really weird and liberaln't legal systems (impressum, requirement to hold the copyright, etc...)
MIT is basically public domain anyways
 
I use BSD0 because CC0 isn't for software and BSD0 doesn't say "public domain" anywhere so google accepts it
 
CC licenses are just really confusing.
 
4:30 PM
well, CC0 works
anyways, why would you care about a public domain project
everyone can do everything already, why is it so hard to relinquish all rights to something, and, more importantly, why would i put so much effort to accomplish that
 
also I want a license that I can read -- BSD0, unlicense work but the unlicense has been criticised
 
It isn't hard. BSD-0 does it in a single sentence.
 
I still prefer "copyleft all wrongs reserved" but that's too open to interpretation
 
@Marshall there's no way BSD-0 accomplishes that in Germany.
 
oh speaking of i was likely going to license ebqn as apache v2, but im open to suggestions
i generally default to gpl v3 but its based on prior work, and apache v2 seems to be the erlang communities default license
 
4:39 PM
@KamilaSzewczyk What does it fail to accomplish exactly? If you're talking about moral rights I don't consider that important. There's no reasonable use of source code that would require you to violate those.
 
@Wezl sorry most CC licenses are, but CC0 is acceptable
 

« first day (1461 days earlier)      last day (1186 days later) »