No other language lets me write straight-line code like this. The `prompt` line saves saves the current continuation in a database, then sends a prompt to the user's browser to select a slot. When selected, `prompt` returns the in-memory @unison-lang.org object which corresponds to the chosen slot.
Chris Penner
@chrispenner.ca
FP and Programming languages nerd Building the Unison Language & Unison Share 📍Victoria BC 🇨🇦 https://chrispenner.ca
Happy to announce Unison Computing is branching out into consulting! iIf you'd like a hand with your project you'd be hard-pressed to find a better team to help, drop us a line 😎
We have a consulting group, now open to work in a variety of languages, including Scala, Haskell, Rust, Elm, and of course Unison. More details here: www.unison-lang.org/blog/consult... Please boost to help get the word out. And we'd love to hear from you if you're interested in working with us!
📰 UCM 1.1.0 is out! * `dependents` can search by variant, not just type or ability name * New built-ins for Argon2id hashing * VS Code actions: Edit Definition & Open on Share * MCP tool: `share-project-info` * Faster bytes ops & improved run command
Release release/1.1.0 · unisonweb/unison
What's Changed Features: The dependents command now work on constructors and ability requests. (#6115) Support for "Edit Definition" and "Open on Share" in the Unison Language VS Code extension v1...
github.com
I made this tool for managing workshop sessions in tmux and I've used it *hundreds of times* per day every day for 6 years now without any hiccups; if you're looking for a good way to manage your terminal sessions maybe this is it. github.com/ChrisPenner/...
GitHub - ChrisPenner/session-sauce: Shell plugin for managing tmux sessions
Shell plugin for managing tmux sessions. Contribute to ChrisPenner/session-sauce development by creating an account on GitHub.
github.com
Unison's got a C FFI! 🎉 If you were waiting for a reason to try Unison, now's a good a time as any :)
🔌 We're adding C FFI bindings! This opens the door to a huge ecosystem of native libraries. Go wrap your favorite C APIs! share.unison-lang.org/@unison/base...
It's absolutely bonkers how much of modern society is still dependent on staying on hold for 2 hours on an unreliable connection when at any moment your thumb could slip or you could drop the call and there's just no way to get that call back except to wait another 2 hours 😑 #WestJet
In any active software project new bugs are always being introduced. Bugs that are important or easy to fix are typically prioritized. This means that as the project ages, the pool of bugs inevitably becomes a majority of the 'difficult to fix' or 'low-priority' variety 😢
🌟 It's time for #AdventOfCode! That means it's a great month to pick up a new programming language! Try it in Unison this year! 🎁
@unison/advent-of-code | Unison Share
🎄Template project with stubs for Advent of Code
share.unison-lang.org
This is actually quite brilliant, up to and including the final sentence 🔥
Sharing atproto-experiments: a foundation for building AT Protocol tools using @unison-lang.org . And the first tool is to sync Bluesky replies as @leaflet.pub comments. #atproto #unisonlang #leafletpub
atproto-experiments
A foundation for building tools on the AT Protocol using Unison Programming Language.
notes.kaushikc.org
In "a new programming paradigm" Dejan Milicic goes into why @unison-lang.org is so unique and useful: docs.google.com/presentation...
Unison: A New Programming Paradigm
print(("Unison", newline)); print("A new programming paradigm") Dejan Miličić JetBrains
docs.google.com
Want to try a radically innovative programming language? Unison is ready! Unison is approachable, user-friendly, and has a great community of friendly folks :) On top of that it has mind-bending features like serializable function closures and built-in distributed programming tools!
🎉 Unison 1.0 has landed! After years of engineering, design, and community collaboration, we’re excited to announce this milestone! Spread the word!
I collected my thoughts on why mutexes suck; and what we can do about it. chrispenner.ca/posts/mutexes #STM #concurrency #parallelism #mutexes #Haskell
Ditch your (mut)ex, you deserve better
Mutexes are unreliable tools, let's explore better alternatives.
chrispenner.ca
🚀 New deep dive: Distributed System Engineering in Unison In our latest blog post, take a look at the design of the Volturno library: a distributed stream processing engine built atop Unison Cloud. www.unison-lang.org/blog/volturn...
Distributed system engineering in Unison: Volturno · Unison programming language
We look at the design of Volturno, a streaming engine with exactly-once processing, to illustrate why Unison Cloud is a great enabler for distributed systems builders.
unison-lang.org
🤯 Unison in the browser!? Dan Freeman's new library, Proscenium, runs Unison code in WebAssembly. Its companion library, @dfreeman/playbill, contains a walk-through of various features and live examples on Unison Cloud! Play a game in your browser entirely in Unison; better yet, write your own!
@dfreeman/playbill | Unison Share
A walkthrough of building UIs with Proscenium, including several example apps.
share.unison-lang.org
📽️ Here's a quick video for anyone just getting started with Unison. The gist of it: install the UCM, create a scratch file in the right place, and have fun programming!
Starting the UCM and setting up a scratch file
This video covers the basics of starting the Unison Codebase Manager (UCM) and writing your first bits of Unison code in a scratch file. We walk through: * Installing Unison on your system (Mac, Linux, or Windows) * Starting the UCM in a working directory * Creating .u scratch files and ensuring the UCM is watching for changes Helpful links: * Install Unison here: https://www.unison-lang.org/docs/quickstart/#step-1-install-unison * Get the UCM Desktop app: https://github.com/unisonweb/ucm-desktop/releases * Join the Unison community: https://www.unison-lang.org/discord
youtu.be
Don't get too hung up on #Monads, there are other ways to sequence effects; including Arrows; and they provide even better static analysis! Let me know what you think :) #Haskell chrispenner.ca/posts/arrow-...
Exploring Arrows for sequencing effects
Monads are <em>one</em> way to sequence effects, but they're not the only way!
chrispenner.ca
I'd really like to speak with whoever thought it was a good idea for the public and private JWK's to be represented by the same type, have the same name, with just a few missing parameters... Ah yes, the presence or absence of this "d" parameter could tank my entire company... seems safe to me :|
Having a 3D printer at home is such a life-hack. Just printed some custom french-cleats to hang a giant 7ft long painting and it made it 10x easier.
I've spent hours over the last months writing a post about how mutexes suck and everyone should use STM instead; but have come to the realization that even STM is more complex than necessary. What's your decision-making process when building a concurrent and/or parallel system? See mine below 👇
I wrote about AI and programming. About the identity challenges we are facing as programmers and the potential erasure of craft. There's a fun little easter egg in the header as well :) hojberg.xyz/the-programm...
The Programmer Identity Crisis ❈ Simon Højberg ❈ Principal Frontend Engineer
On AI, Creativity, and Craft
hojberg.xyz
I'm very pleased to call Simon ( @hojberg.xyz ) my co-worker, team-mate and friend, go check out this wonderfully written take. hojberg.xyz/the-programm...
The Programmer Identity Crisis ❈ Simon Højberg ❈ Principal Frontend Engineer
On AI, Creativity, and Craft
hojberg.xyz
IMO we shouldn't be trying so hard to solve "the expression problem"; We should make it easy to update existing functions when types change, but it shouldn't always "silently work" with the new type; oftentimes existing functionality needs a human to look over it when there are changes!
What do folks out there do for error handling in concurrent tasks in #Haskell? For now I've settled on having an error `TMVar`, then use a `ki` structured concurrency scope which forks all my jobs and ends in an `(Right <$> awaitAll) <|> (Left <$> readTMVar errVar)`
TIL callCC's return value isn't rank 2 polymorphic (but you can just route it through Void and use `absurd` to make it rank 2 polymorphic) Spent too long staring at the error wondering why it wasn't working haha. #Haskell github.com/haskell/mtl/...
Why not use rank 2 polymorphism for `callCC` · Issue #127 · haskell/mtl
I think rank 2 polymorphism is a must-have for callCC, or this code will not compile: f :: Int -> String f x = (`runCont` id) $ callCC $ \exit -> do y <- case x of 0 -> exit "error: x == 0" _ -> pu...
github.com
Huh, TIL that `Text.lines != Text.splitOn "\n"` when the string ends in a newline.
You can now spin up Unison Cloud clusters on your own infrastructure! ✅ Build elastic distributed systems and services in vastly less code ✅ Fast, typed RPC ✅ Deployments in seconds ✅ Free to get started youtu.be/0sZqI1XoGLY
Unison Cloud on your infrastructure
YouTube video by Unison Language
youtu.be
Interesting article by @chrispenner.ca about why monads aren't the solution to everything, and a functor I've never crossed paths with called selective applicatives. Still absorbing it, but great read as always. Check it out if that's your thing. chrispenner.ca/posts/expres...
Monads are too powerful: The Expressiveness Spectrum
Monads are a useful tool, but what costs do we pay for their expressive power?
chrispenner.ca