I like that it's a daemon. You can connect to it from various clients, do stuff, disconnect, and your stuff is still there when you come back, your processes are just running in the background. Conceptually, it's no different than SSHing into your favorite remote system.
In contrast to most other image systems, that are not, routinely, just a long running generic processor.
It's not "Lisp OS", but it's Lispy-ish OSey-ish.
They have their own cool little, byte code compiled Lisp, with the mailbox, and multi-processing intrinsic, and those isolated name spaces, which is nice. There's no shared memory, just message passing. That's fun and geeky.
Mailboxes/queues are not ubiquitous on Unix systems compared to streams and pipes and sockets. The queues, while they exist, are not readily lifted in the shells and such, so they become a specialty item.
Whereas in Unix, you can craft simple services using, well, anything, and inetd, that's still different from a long running mailbox listener.
They have different purposes, and the systems that use one as their hammer vs the other, will look different. But the important thing is making those services simple to make and use.
> For example, annual jobs can be represented as a infinite looping program that sleeps for a year
Does your system actually implement true durable compute? Like I can restart my mac or stop the daemon and it's (apparently) not only smart enough to resume this process where it left off but also account for the time delay and reschedule the wakeup? Astounding if true— if you do what's your strategy for achieving it?
I loved my time there - I attended batch in-person in NYC.
Specifically:
- I enjoyed how passionate everybody was about something - and how deep they pursued their interests. Everybody was generous with their time and knowledge, and it helped me connect new concepts together in ways I couldn't have alone.
- I loved having dedicated time and space to focus on this passion project, full time. I joined with the specific goal of building a "livable" MVP during the 3 months I was at Recurse.
- It was great to be in an environment where people were performing computer stats + shenanigans purely for fun.
Pretty wild, I've been collecting a few ideas myself about a "dream language" + runtime that I eventually want to make for myself, and it shares a lot of characteristics with this. Looks really cool.
Looks good, but Erlang gen_srv, supervisor analogs needs to be created, along with the standard Erlang messaging logic around it, for this project to be useful.
could you dive into the gen_srv a bit more? From what I understand about erlang the value prop is already enormous, what extra does gen_srv add? It seems like people who Erlang understand this intuitively so I haven't really been able to find it explicitly explained anywhere
`gen_server` is an abstraction over the a client sending a `request` that a server services to produce a `response` to be sent to the client.
The `gen_server` implementation takes care of things like timeouts, servers terminating before a response is produced as well as maintaining the server state.
I'll add to this that the "abstraction" component of this description is key and the use-case for a gen_server is far more broad than what you might expect in say a networking or web context.
You would use them for instance when you need to group behavioral units with a defined interface, even if you don't require any explicit networking.
This is a bit reductive and wrong in some ways but think of gen_server modules and instances as "sort of" like classes/objects. You "send messages/requests" instead of "calling methods," but the spirit is essentially the same -- it's a way of modeling the world with code
Author here - wanted to drop some context on the project from the README:
---
[vrs](https://github.com/leoshimo/vrs) is a personal programming runtime - a sandbox for building my “endgame” software platform.
The goal is to create a computing environment that brings me joy.
Each piece - the language, runtime, tools, and more - is designed as part of one holistic experience.
I live on a collection of personal software running on vrs every day, evolving the runtime as I go.
Inspired by systems I love - Emacs, Erlang, Unix, Plan 9, and Hypermedia - combining their powerful ideas into something that feels just right for me.
Built at the [Recurse Center](https://www.recurse.com/).
Well, I really like this thing.
I like that it's a daemon. You can connect to it from various clients, do stuff, disconnect, and your stuff is still there when you come back, your processes are just running in the background. Conceptually, it's no different than SSHing into your favorite remote system.
In contrast to most other image systems, that are not, routinely, just a long running generic processor.
It's not "Lisp OS", but it's Lispy-ish OSey-ish.
They have their own cool little, byte code compiled Lisp, with the mailbox, and multi-processing intrinsic, and those isolated name spaces, which is nice. There's no shared memory, just message passing. That's fun and geeky.
Mailboxes/queues are not ubiquitous on Unix systems compared to streams and pipes and sockets. The queues, while they exist, are not readily lifted in the shells and such, so they become a specialty item.
Whereas in Unix, you can craft simple services using, well, anything, and inetd, that's still different from a long running mailbox listener.
They have different purposes, and the systems that use one as their hammer vs the other, will look different. But the important thing is making those services simple to make and use.
> For example, annual jobs can be represented as a infinite looping program that sleeps for a year
Does your system actually implement true durable compute? Like I can restart my mac or stop the daemon and it's (apparently) not only smart enough to resume this process where it left off but also account for the time delay and reschedule the wakeup? Astounding if true— if you do what's your strategy for achieving it?
How would you describe/rate your experience at recurse center?
I loved my time there - I attended batch in-person in NYC.
Specifically:
- I enjoyed how passionate everybody was about something - and how deep they pursued their interests. Everybody was generous with their time and knowledge, and it helped me connect new concepts together in ways I couldn't have alone.
- I loved having dedicated time and space to focus on this passion project, full time. I joined with the specific goal of building a "livable" MVP during the 3 months I was at Recurse.
- It was great to be in an environment where people were performing computer stats + shenanigans purely for fun.
It was the perfect setup for me!
I'm having vrsjmp crash on start:
thread 'main' panicked at /Users/Username/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tao-0.16.10/src/platform_impl/macos/window.rs:268:21: null pointer dereference occurred note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace thread caused non-unwinding panic. aborting. [1] 31647 abort ./target/debug/vrsjmpDo you accept PR's for fixes ?
The project isn’t open to contributors, but I appreciate the thought!
(although I can’t help but wonder about the crash - I can’t seem to repro it. I’ll end up taking a look when I can…)
Thank you for your effort, I look forward to it if/when you open up to contributors.
Pretty wild, I've been collecting a few ideas myself about a "dream language" + runtime that I eventually want to make for myself, and it shares a lot of characteristics with this. Looks really cool.
Does this project have some relation to LFE?
> Does this project have some relation to LFE?
Can you clarify what "LFE" stands for? Do you mean "Lisp Flavored Erlang" or something else?
Yes, Lisp Flavoured Erlang.
it does not, although LFE is a cool project
Looks good, but Erlang gen_srv, supervisor analogs needs to be created, along with the standard Erlang messaging logic around it, for this project to be useful.
gen_srv, supervisor analogs needs to be created
Agreed on `supervisor` - that's high up on my list to tick off when the occasion arrives.
On `gen_srv` - while there's room to iterate, I consider the `spawn_srv` / `bind_srv` to be a sufficient analog for me:
https://github.com/leoshimo/vrs?tab=readme-ov-file#services-...
could you dive into the gen_srv a bit more? From what I understand about erlang the value prop is already enormous, what extra does gen_srv add? It seems like people who Erlang understand this intuitively so I haven't really been able to find it explicitly explained anywhere
`gen_server` is an abstraction over the a client sending a `request` that a server services to produce a `response` to be sent to the client.
The `gen_server` implementation takes care of things like timeouts, servers terminating before a response is produced as well as maintaining the server state.
You can read more here at [1], [2] and [3].
[1]: https://learnyousomeerlang.com/clients-and-servers#callback-...
[2]: https://www.erlang.org/doc/system/gen_server_concepts
[3]: https://www.erlang.org/doc/apps/stdlib/gen_server.html
I'll add to this that the "abstraction" component of this description is key and the use-case for a gen_server is far more broad than what you might expect in say a networking or web context.
You would use them for instance when you need to group behavioral units with a defined interface, even if you don't require any explicit networking.
This is a bit reductive and wrong in some ways but think of gen_server modules and instances as "sort of" like classes/objects. You "send messages/requests" instead of "calling methods," but the spirit is essentially the same -- it's a way of modeling the world with code
"Computing should be viewed as an intrinsic capability of objects that can be uniformly invoked by sending messages." p 290
1981 "Design Principles Behind Smalltalk"
https://archive.org/details/byte-magazine-1981-08/page/n298/...
> You "send messages/requests" instead of "calling methods,"
Sounds like Smalltalk.
I just wanna say Long Live Lisp
Amen brother
[flagged]