Chris Penner's Avatar

Chris Penner

@chrispenner.ca.bsky.social

FP and Programming languages nerd Building the Unison Language & Unison Share ๐Ÿ“Victoria BC ๐Ÿ‡จ๐Ÿ‡ฆ https://chrispenner.ca

438 Followers  |  561 Following  |  155 Posts  |  Joined: 15.11.2024  |  1.7704

Latest posts by chrispenner.ca on Bluesky

it's hard to put it into words but #jj-vcs has rewired my brain into thinking about commits more "meaningfully". i think gitโ€”and to a large extent githubโ€”have made commits feel "cheap", something you don't put much thought into. just a thing you have to do before you "push your change".

26.05.2025 12:23 โ€” ๐Ÿ‘ 13    ๐Ÿ” 2    ๐Ÿ’ฌ 2    ๐Ÿ“Œ 0

Things are always changing, and a lot is different from 2024, give it another try sometime :)

26.07.2025 17:20 โ€” ๐Ÿ‘ 2    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

However weโ€™ve also been considering different forms of definition identity, like an embedded ID or something (separate from the hash).

At any rate, as it is now upgrades between libraries work fine and still allow having multiple versions of a library if you want ๐Ÿ˜„

26.07.2025 16:36 โ€” ๐Ÿ‘ 6    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

Weโ€™re still figuring out exactly how to do upgrades in the most ergonomic way, but what has been working so far is to map corresponding hashes between versions using names, then auto-propagate through the dependencies.

26.07.2025 16:36 โ€” ๐Ÿ‘ 4    ๐Ÿ” 0    ๐Ÿ’ฌ 2    ๐Ÿ“Œ 0

Just curious, are you able to quantify what was less than ideal about the LSP? If you can point at anything specific Iโ€™d love to get it patched up!

26.07.2025 16:30 โ€” ๐Ÿ‘ 2    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

@unison-lang.org kind of accomplishes this, all code is identified by hash, so if you contribute a given definition, when itโ€™s adopted the hashes will match and nothing complains.

26.07.2025 16:28 โ€” ๐Ÿ‘ 8    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

A deployment pipeline that ships your code to staging, and hides the โ€œDeploy to prodโ€ button somewhere in your app on staging. You have to dig through your app, running your new code, to find it.

26.07.2025 06:16 โ€” ๐Ÿ‘ 6    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

Iโ€™d love to make the type search global across projects in UCM!

24.07.2025 21:29 โ€” ๐Ÿ‘ 3    ๐Ÿ” 1    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

Very cool!

16.07.2025 07:40 โ€” ๐Ÿ‘ 10    ๐Ÿ” 3    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

Unison uses this system to propagate changes in dependencies, but you can imagine a system which uses a similar method to propagate changes to function colouring

16.07.2025 05:59 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

And yes, time grows with the number of dependents, but Unison only needs to recompile actual dependencies, whereas most languages will recompile entire upstream modules when thereโ€™s a change.

16.07.2025 05:57 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

Itโ€™s unidirectional, changes in a definition propagate to the definitions which depend it.

You donโ€™t need to imagine it though you can try it out if you like: @unison-lang.org

16.07.2025 05:57 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

Youโ€™d still need to handle the newly propagated code if it somehow fails to compile of course, but I think what annoys people the most is just that they have to reannotate the entire function stack

16.07.2025 00:31 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

Unison doesnโ€™t have an async keyword, so such a system that propagates function colouring like that is hypothetical, but definitely possible.

16.07.2025 00:30 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

It depends!

For almost all languages yes, itโ€™s an issue, but Iโ€™m spoiled by Unison, it can handle and auto-propagate even some type-changing updates, so sometimes you can upgrade a library and have it propagate updates through your codebase ๐Ÿ˜„

16.07.2025 00:30 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

Also, IMO function colouring is great and desirable, the bad part is that the user has to update all the call sites and signatures manually. Any sufficiently advanced code storage system should be able to automate this, but alas, most programs are still stored as plain text in a file somewhere.

14.07.2025 18:22 โ€” ๐Ÿ‘ 3    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

STM is smart too; so it won't spam like a busy-wait would, it only prints a trace once per block.

25.06.2025 17:53 โ€” ๐Ÿ‘ 2    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0
-- Hack for finding blocking points in your complex concurrent systems, 
-- you can literally just print where in the system you're blocked!

readQ :: String -> STM.TBMQueue a -> STM.STM (Maybe a)
readQ qName q = do
      STM.readTBMQueue q <|> do
        traceM $ "Blocked Reading from " <> qName
        retry
writeQ :: Text -> STM.TBMQueue a -> a -> STM.STM ()
writeQ qName q val = do
      STM.writeTBMQueue q val <|> do
        traceM $ "Blocked Writing to " <> qName
        retry

-- Hack for finding blocking points in your complex concurrent systems, -- you can literally just print where in the system you're blocked! readQ :: String -> STM.TBMQueue a -> STM.STM (Maybe a) readQ qName q = do STM.readTBMQueue q <|> do traceM $ "Blocked Reading from " <> qName retry writeQ :: Text -> STM.TBMQueue a -> a -> STM.STM () writeQ qName q val = do STM.writeTBMQueue q val <|> do traceM $ "Blocked Writing to " <> qName retry

Cool trick for finding bottlenecks in your concurrent systems; sometimes you can just literally print where you're currently blocked.

25.06.2025 17:24 โ€” ๐Ÿ‘ 13    ๐Ÿ” 1    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 1

When people talk about 'inherent' complexity they're probably talking about an authorization system or a notification system ๐Ÿ˜ตโ€๐Ÿ’ซ

I will say that designing flexible and performant versions of each of these has been a great design challenge though, a lot of fun to figure out ๐Ÿ™‚

11.06.2025 23:35 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0
Preview
Building Industrial Strength Software without Unit Tests Unit tests aren't the only way.

Did you know that #Unison Share is a full-featured code-repository and collaboration platform that *doesn't have a single unit test*?

Here's how that works:
chrispenner.ca/posts/transc...

(*spoiler*: it's great!)

@unison-lang.org

03.06.2025 16:57 โ€” ๐Ÿ‘ 7    ๐Ÿ” 1    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

Saw someone asking about a Haskell debugger on Reddit today and realized how _weird_ it is that Haskell doesn't really have a good story here, but also how weird it is that I don't ever find myself reaching for one.

Maybe I'm sufficiently stockholmed into TDD (Trace driven development) by now?

08.05.2025 02:42 โ€” ๐Ÿ‘ 7    ๐Ÿ” 0    ๐Ÿ’ฌ 3    ๐Ÿ“Œ 0
Preview
3 things other languages should steal from Unison Some things other languages should steal from Unison

๐Ÿ’ We encourage everyone to take inspiration from Unison's core ideas and practices. The more programming languages and tools challenge the status quo, the faster "outlandish" becomes "obviously better." Here's @chrispenner.ca on three things other languages should steal from Unison:

28.04.2025 18:00 โ€” ๐Ÿ‘ 13    ๐Ÿ” 6    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0
Pandoc - index

Pandoc is dope too! pandoc.org

20.04.2025 00:31 โ€” ๐Ÿ‘ 3    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

Yeah the secret is to collect as many obscure languages as possible :)

I'm planning to learn Gleam at some point

10.04.2025 17:02 โ€” ๐Ÿ‘ 2    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

#Python devs get sad #Haskell doesn't have examples, but I'll take reliable type information and generated docs over the haphazard python docs situation every day of the week.

01.04.2025 23:07 โ€” ๐Ÿ‘ 5    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

It is absolutely bonkers to me that there still isn't a standard way to just see which functions a python module exposes. I know it's dynamic enough to generate new ones at runtime, but like, I'm just tryin' to look at docs!

01.04.2025 23:07 โ€” ๐Ÿ‘ 5    ๐Ÿ” 0    ๐Ÿ’ฌ 2    ๐Ÿ“Œ 0

AMAZING, thanks for sending this my way, I'll definitely be checking this out!!

31.03.2025 16:26 โ€” ๐Ÿ‘ 2    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

I'm officially adding Notification Systems to my list of inherently hard problems. I've got:

* Cache invalidation
* Authorization
* Notification Systems

What's on your list?

27.03.2025 19:11 โ€” ๐Ÿ‘ 4    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0
Video thumbnail

๐Ÿค We've just added collaborator support to Unison Share!

You can now add fellow Unison devs to your projects with these roles:

๐Ÿ‘๏ธ View โ€“ Read & download
๐Ÿ”ง Maintain โ€“ Read, download, merge & write
๐Ÿ”‘ Admin โ€“ Full admin permissions

Try it out here: share.unison-lang.org/

25.03.2025 17:39 โ€” ๐Ÿ‘ 8    ๐Ÿ” 4    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

As always, my problem was solved with yet another layer of abstraction :P

24.03.2025 19:36 โ€” ๐Ÿ‘ 2    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

@chrispenner.ca is following 19 prominent accounts