Sign in

Alice ✨

@welltypedwit.ch
3K followers 343 following 6.6K posts

There’s no sense crying over every mistake. You just keep on trying ’til you run out of cake - GLaDOS welltypedwit.ch

PostsRepliesMedia
Reposted by Alice ✨
teo @doublenegation.bsky.social · 9h
Blog post about instrumenting Lix evaluation with Tracy informal.codes/posts/tracy-lix
0113
Alice ✨ @welltypedwit.ch · 8h
right?? the only reason I ever use it is to get to the download button (that is of course unclickable until the reader has finished loading lol)
010
Alice ✨ @welltypedwit.ch · 19h
my favorite is how if it breaks (which it does pretty regularly because of course it does), the button it shows you on the error message to navigate away is also unclickable
010
Alice ✨ @welltypedwit.ch · 19h
it's genuinely impressive how often the acm pdf reader thing makes every button unclickable i would not know how to do that intentionally without putting in a lot of extra effort
4111
Alice ✨ @welltypedwit.ch · 30/09/2026
yes. it's also older than rust ^^ e.g. i found a random haskell cafe thread from 2008 that mentions it: mailman.haskell.org/archives/lis...
mailman.haskell.org
Re: [Haskell-cafe] Fighting the monad stack, MonadIO - Haskell-Cafe - Haskell.org
180
Alice ✨ @welltypedwit.ch · 30/09/2026
(that one does come up occasionally though since `case x of Blah y -> y` has different semantics depending on whether that Blah is a newtype pattern or a regular data constructor pattern)
030
Alice ✨ @welltypedwit.ch · 30/09/2026
it's very common in haskell as well. i don't think i've heard "newtype pattern" before, aside from like, a pattern that matches on a newtype
2100
Alice ✨ @welltypedwit.ch · 29/09/2026
idk, maybe it's not that bad though. one nice advantage i have is that boxing twice doesn't actually do anything so you at least couldn't accidentally pessimize your code that already explicitly boxed things
020
Alice ✨ @welltypedwit.ch · 29/09/2026
yeah but if you decide that this thing should be boxed at that stage, then that might have a pretty serious performance cost since it now suddenly needs to insert box/unbox operations everywhere and that cost is very hard to see from the user's perspective
220
Alice ✨ @welltypedwit.ch · 29/09/2026
well it is strictly faster than even your working solution here so... ^^ (it's also definitely a moving gc. currently it's entirely generational copying but i would maybe like a concurrent non-moving major heap later, depending on how much i want future alice to hate me when she has to debug it)
120
Alice ✨ @welltypedwit.ch · 29/09/2026
(if i do it entirely as an optimization in the backend, you will get very subtle heap allocations and if i do it on the frontend where it impacts types, i need to decide what "too large" means and that gets very messy once you involve abstract types that don't expose how large they actually are)
120
Alice ✨ @welltypedwit.ch · 29/09/2026
(i'd like to auto-box large representations automatically at some point, i'm just not really sure how to do it in a way that is transparent)
120
Alice ✨ @welltypedwit.ch · 29/09/2026
and you wouldn't need any downcasting tricks since the string stored inside the JSON is also just its own heap object that you can share however you want without copying anything
211
Alice ✨ @welltypedwit.ch · 29/09/2026
if we assume that the `JSON` enum itself is large, you can just put it behind a Box and get something similar to your Arc solution, except a lot more efficient (no actual RC, bump pointer allocation)
110
Alice ✨ @welltypedwit.ch · 29/09/2026
✨garbage collection✨ ^^ so, your first approach would already Just Work because copying the json object would only do a shallow copy of a few bytes (since all the large values (strings, maps, arrays) are already behind a pointer and vega doesn't have ownership)
130
Alice ✨ @welltypedwit.ch · 29/09/2026
very cool!! (also obligatory "vega fixes this" ^^)
140
Reposted by Alice ✨
PolyWolf @wolf.girl.technology · 29/09/2026
New blog post: "Pining for Arc Downcasting in Rust" wolfgirl.dev/blog/2026-09-29-pining… #programming #rust
6243
Alice ✨ @welltypedwit.ch · 27/09/2026
but it also makes my goal of beating rustc in at least one benchmark seem much easier to achieve than i thought ^^
0110
Alice ✨ @welltypedwit.ch · 27/09/2026
i was really concerned for a second why my (naive, non-gc) vega code was so much slower but no, rust is exactly as slow lol (which makes sense since it's really just LLVM at that point and the entire benchmark is dominated by allocation performance anyway (which is why ghc is so fast))
1100
Alice ✨ @welltypedwit.ch · 27/09/2026
funny how if you pick the right benchmark, ghc can beat rustc by a factor of 10
1130
Alice ✨ @welltypedwit.ch · 27/09/2026
i love tailcc
$ time vega build -O3
Executed in  365.52 millis
...
$ time vega build -O0
Executed in    7.32 secs
080
Alice ✨ @welltypedwit.ch · 26/09/2026
"idris2 promised to be systems level but the betrayal is now evident and it is slower than haskell" okay, insane phrasing aside, when did idris2 (the language that deliberately compiles to chez scheme so it doesn't need to implement its own complex backend) promise to be "systems level"
1130
Alice ✨ @welltypedwit.ch · 26/09/2026
"[ghci] is responsive since it only type checks and reloads byte code" ah yes, ghci type checks bytecode. that's absolutely how interpreters work, mr compiler engineer
190
Alice ✨ @welltypedwit.ch · 26/09/2026
"haskell compilation times are almost as bad as rust's" they're quite a lot worse actually lol. you missed the one opportunity where you could have given an actually applicable criticism and you still missed it
1140
Alice ✨ @welltypedwit.ch · 26/09/2026
"last time i was running cachegrind on a ghc profile it was spending some 99% in the evacuate function" well yeah if you use a tool that ghc doesn't support you will get bullshit outputs. (you can use `+RTS -s` to see the actual gc time and it's usually closer to ~10%)
1110
Alice ✨ @welltypedwit.ch · 26/09/2026
"that sentence only makes sense to me if you wanted ever parameter to be lazy and have decided to encode every program as a graph" no, it literally doesn't. the entire point is that encoding it as a graph is the solution to this
180
Alice ✨ @welltypedwit.ch · 26/09/2026
omg how can you call yourself a "type theorist and compiler engineer" and then struggle to understand this trivial sentence from SPJ's "implementation of functional programming languages" that says literallly nothing other than that naively substituting variablles in a syntax tree is inefficient"
In Chapter 12 we saw that a lambda abstraction can be applied to an argument by constructing an instance of the body of the abstraction with substitutions made for occurrences of the formal parameter. Unfortunately, this involved an inefficient traversal of the tree representing the body of the abstraction, and the presence of free variables seemed to make a more efficient implementation rather difficult.
1100
Alice ✨ @welltypedwit.ch · 26/09/2026
"the hope that [due to laziness] unused values can be skipped is mostly wishful thinking. programmers already use if statements pretty intelligently for that" how did they watch this back and come to the conclusion "yes, this is something that should be uploaded to youtube for everyone to see"
1130
Alice ✨ @welltypedwit.ch · 26/09/2026
"Haskell's least forgivable misstep is performance [including] a gargabe collector that cannot be removed" oh no that would have been on the bingo card
2130
Alice ✨ @welltypedwit.ch · 26/09/2026
ok nevermind, don't take shots to this, you might not survive bsky.app/profile/well...
190
Alice ✨ @welltypedwit.ch · 26/09/2026
"i don't like do syntax" i should have made a bingo card...
1110
Alice ✨ @welltypedwit.ch · 26/09/2026
"note that simply dependent types provide a much more solid approach to meta programming since you can write derivation functions directly in the core language" dependent types mentioned in a context where they're not applicablle at all. take a shot
2130
Alice ✨ @welltypedwit.ch · 26/09/2026
it (*optionally*) gives you wrappers that work in a monad so that you can use them in combination with operations that query the environment (reify), but how on earth do you get to "little control over what gets generated" from that
1110
Alice ✨ @welltypedwit.ch · 26/09/2026
"It's very difficult to reason with [TemplateHaskell] since it's a monadic DSL so we're dealing with imperative order-dependent generation with very little control over what gets generated" omfg TH literally makes you write out the syntax tree.
1140
Alice ✨ @welltypedwit.ch · 26/09/2026
"type classes are a foreign mechanism that doesn't share a theory with hindley milner" i... don't even know what to say to that lol
1160
Alice ✨ @welltypedwit.ch · 26/09/2026
"ocaml which steadfastly refused to go off the rails [..]" lmaoo
190
Alice ✨ @welltypedwit.ch · 26/09/2026
funny how like, almost every claim is just wrong or at least massively misleading
2100
Alice ✨ @welltypedwit.ch · 26/09/2026
oh that stupid incorrect haskell video is made by the guy that made that stupid incorrect rust video. that makes sense.
6370
Alice ✨ @welltypedwit.ch · 25/09/2026
> In addition, premature promotion will increase the incidence of nepotism, as ‘tenured’ garbage objects in the old generation preserve their offspring in the young generation, artificially inflating the survival rate as those dead children will also be promoted. we have... interesting terminology
1400
Alice ✨ @welltypedwit.ch · 25/09/2026
lol fair. i'm just curious because this is something i don't think i've ever even considered wanting to do ^^ (and i guess the reason it's not there anymore is probably that it caused more harm by people accidentally reloading their important tabs than good in the 1% case where it might be useful)
120
Alice ✨ @welltypedwit.ch · 25/09/2026
why do you want to reload all tabs?
110
Alice ✨ @welltypedwit.ch · 24/09/2026
for all their flaws, sometimes i really wish i could have either an ocaml-style interface file or haskell-style export list in rust. it's so nice to be able to specify the interface cleanly in one place before worrying about the actual implementation
3280
Reposted by Alice ✨
waffle .-. @waffle.pet · 23/09/2026
I'm giving a talk titled "breaking changes are a social construct" tomorrow at the Amsterdam Rust meetup. You should come if you can! www.meetup.com/rust-amsterd...
meetup.com
Rust Meetup @ BlockTech, Thu, Sep 24, 2026, 6:30 PM | Meetup
Join us for an evening of cutting-edge Rust talks, real-world use cases and great conversations hosted at BlockTech. This meetup is open to anybody who has an interest in t
2354
Alice ✨ @welltypedwit.ch · 21/09/2026
found the haskell programmer ^^
140
Alice ✨ @welltypedwit.ch · 21/09/2026
ohh interesting, thanks!
000
Alice ✨ @welltypedwit.ch · 21/09/2026
but ocaml doesn't actually get the benefits of either one (and in practice it doesn't matter anyway since all your dependencies are going to break in 5 years)
030
Alice ✨ @welltypedwit.ch · 21/09/2026
i also find it so unfortunate how half-assed everyone's approach to backwards compatibility is. you can either actually commit to not breaking code (like c# where every new keyword is a conditional keyword for this exact reason) or you can do some actual meaningful breaking changes from time to time
360
Alice ✨ @welltypedwit.ch · 21/09/2026
(also I think the number of people that use effect as a variable is not much lower than the number that use it as a keyword ^^)
120
Alice ✨ @welltypedwit.ch · 21/09/2026
and yet all the guarantees that should have bought go out the window because of some dumb triviality like adding syntax for a language feature 99% of users are never going to touch
120
Alice ✨ @welltypedwit.ch · 21/09/2026
i just find it funny that lots of genuinely good changes (like changing the horrible type variable behavior) will probably never happen because of backwards compatibility concerns...
120