Show HN: Common Lisp running natively over WebAssembly for the first time (soi-disant.srht.site)
This is significant as it's the first time Common Lisp in particular has ever been hosted on it; wasm has a few poor decisions in its design that make it less-than-conducive to being a target for Common Lisp, and a lot of the more interesting implementations require an implementation to already be on the platform for bootstrapping purposes.
My previous attempts using other implementations haven't gone so well, despite throwing a lot of time at it (as an example, I have a fork of Eclipse Common Lisp, a defunct implementation from the 1990s, sitting on my disk with a few hundred lines of changes that I finally got to successfully compile and run a handful of very basic expressions, but it blows up when you try and define anything). In comparison, I was pleasantly surprised by how little I had to do, even though I did end up scrapping loads of lines of my own changes to npt in the process as I got a handle on how to make it work acceptably.
The Emscripten toolchain and I don't get along, partially because I don't like inlining ECMAScript into my C and vice-versa, so it's little more than a neat little demo right now.
You can load slightly more complex programs into it by hijacking the "imp" ECMAScript function every few hundred milliseconds with strings containing complete forms (this is essentially a batch processor, so there's no interactivity that allows it to wait while you decide what the rest of a form should be). Only one at a time, though. It's not that fancy.
If you mess up at all, even just a little error, it will crash. This is by design; I disabled the debugger. It's a giant hack, and the hack I eventually decided on left it impossible to have a debugging experience, with the benefit of getting to use a closer-to-unmodified npt.
This could be more useful, if I spent more time on it, but it's more fun if it's just a demo. I hope you enjoy the toy I made for you.
https://en.wikipedia.org/wiki/Batch_processing
If you don't know what forms are in the context of Common Lisp:
http://www.lispworks.com/documentation/HyperSpec/Body/03_aba...
http://www.lispworks.com/documentation/HyperSpec/Body/26_glo...
71 comments
[ 4.5 ms ] story [ 149 ms ] threadI don't understand why I got downvoted, it seems HN users with power to downvote just see everything is a nail they wanted to exercise their power.
Anyway, I'd probably write one when I actually implement it. I know linear memory is available but not sure whether or not having GC or mechanism that make memory safe.
> …wasm has a few poor decisions in its design that make it less-than-conducive to being a target for Common Lisp…
Could you say a bit more about those design decisions?
Why does it have that limitation, and is there any hope that it will someday be overcome?
It was designed to support C-like languages, so you can do the equivalent of loading a DLL (or dynamic shared object). However in Lisp it is not unusual to compile just one function at a time. It's definitely possible to create a DLL for each function and load each DLL, but it requires a completely different architecture than most Lisp implementations use (in which, when you compile a function, it just writes the machine code to the heap).
There are similar impedance mismatches with so-called W^X systems (where you are disallowed from having a page be both (W)ritable and e(X)ecutable.
Pyodide can dynamically load libraries that are separate Wasm modules so it is worth checking out how that works.
WASM also doesn't allow for functions with variadic return counts.
You know, I wonder how seriously I could be taken if I duck-taped a wasm-capable browser together out of Servo and Wasmtime to make a second implementation and push it forwards...
If you really wanted full tail-call behavior, you would either have to compile every function into the same mega-function in a loop and have some sort of if/else tree, or use trampolines (which would additionally require either storing parameters in memory somewhere or using the same type signature for all functions, since function calls are typed).
Overall, it's not a super great situation for true tail-call elimination. For now, I've implemented limited tail-call elimination for single-function recursive calls (transforming them into an in-function loop), and that's patched things up enough for me to continue working for now until I either need to come up with an optimized trampoline or the tail_call instruction finally gets standardized.
https://sourceforge.net/p/sbcl/mailman/message/34821303/
I think that the people who responded to you covered much of it, but you can find more by doing a web search for it. I'd find you links myself, but it's early in the morning and I'm a little tired.
I know that even the language itself is kind of the opposite of "beautiful", but the way all docs, blogs, websites etc. look ...seriously, is this intended to scare away any aesthetically sensitive people? Programming languages are about aesthetics too, and Lisp at its core (not CL ofc) is absolutely beautiful!
I don't know if I feel more or less betrayed by the fact that the HTML seems to be more or less bespoke and a screen reader would have no problem with the page, but all of these choices feel all the more intentional.
However, the contrast is WCAG AA-conformant (except for the links that aren't in a black box, which aren't important links, as I went out of my way to confirm as I wrote the post). The page is actually pretty accessible.
Accessibility is important to me, as many people I've known in my life have been disabled, but so are silly aesthetic choices.
It was intentional, but it also was well-intentioned. That's why it's readable in more or less every web browser, regardless of whether it supports the one line of CSS I'm using, and accessible to screen readers (although I didn't throw in any elements specifically for them, the page is written simply enough that it should work, intentionally).
Yellow as background can work well, but this is not the way.
Your comment kind of shows some biases you might want to work on.
But I grant that my comment was flippant and OT, potentially ad hominem denigrating even if unintended. I'll try better next time. You on the other hand might try harder to make websites that are readable to ordinary people. Or not.
My post is WCAG AA-compliant, except for the very specific occurrence of meaningless social links, and those meaningless social links render well in a browser's 'Reader View'. My site contains no ECMAScript aside from what was necessary to get the toy working. I care deeply about making things accessible; it's important to me.
So, this seems to be a simple misunderstanding then. Because that's not what I mean (nor wrote). Anyhow, although we can probably continue to debate the finer points of this, I propose we don't. Have a good evening.
I think this aspect of ignoring UIs and aesthetics has seriously held back CL.
How about CLOG and cl-cffi-gtk?
The CL library you linked is for connection to GTK, a desktop UI scheme. So, while interesting, that doesn't really help someone who is trying to develop a browser-native app, which is where the world has gone at the moment.
I think Lisp got left behind on the journey, and I think this UI problem is one of the top reasons, the other one being terrible-non-IDE-like-substances.
I wouldn't go as far as to say CL got left behind in the journey, it's still very much alive. But if you want to go with something with more mainstream appeal (not a bad want IMO) there's always Clojure.
My aesthetic choices were intentional, and almost nothing in your comment is right.
>...
>Permissions related to performance and to creation of derivative works are expressly NOT granted.
>Permission to make modified copies is expressly NOT granted.
>Permission to add or replace any links or any graphical images to any of these pages is expressly NOT granted.
It's one of the most restrictive licences.
1: https://github.com/phoe/clus-data/tree/master/live/cl
What? It looks perfectly fine on my monochromatic Genera monitor!
Jokes aside, Firefox's reader view makes it only marginally more readable. I wonder if it took the author extra effort to make it look like that, and whether there's a better page sanifier than the reader view.
https://news.ycombinator.com/newsguidelines.html
Your comment particularly broke the Show HN guidelines:
https://news.ycombinator.com/showhn.html
I'm thankful it is a simple HTML page that could be easily formatted using browser-built-in tools.
I lost … perhaps I expect a REPL or … anyway not good to sell CL-webassembly I think.
It's not meant to be sold, it's just a little toy.
https://news.ycombinator.com/newsguidelines.html
[edit]
Just tried again today and Firefox gets to a REPL in about 3.5 minutes, while chromium is still right about 1 minute.
1: https://abcl.org/
2: https://plasma-umass.org/doppio-demo/
Unfortunately, a JVM on wasm would be quite difficult for the same reason that Lisp over wasm is quite difficult (I had actually looked for wasm JVMs before trying anything). I had no idea there was a JS JVM implementation! That's very cool.